C国演义 [第五章]

news2024/11/27 1:27:09

第五章

  • 子集
    • 题目理解
    • 步骤
      • 树形结构
      • 递归函数
      • 递归结束的条件
      • 单层逻辑
    • 代码
  • 子集II
    • 题目理解
    • 步骤
      • 树形结构
      • 递归函数
      • 递归结束的条件
      • 单层逻辑
    • 代码

子集

力扣链接

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]

  • 提示:
    1 <= nums.length <= 10
    -10 <= nums[i] <= 10
    nums 中的所有元素 互不相同

题目理解

一看就是 回溯组合 , 那么跟 回溯组合有什么不同呢?

  • 回溯组合中的, 接收结果是在叶子节点, 而这个子集是收集各个节点上的数据

步骤

树形结构

递归函数

首先, 还是两个全局变量, 一个记录单层结果, 一个记录全部结果

vector<int> path; // 记录单层结果
vector<vector<int>> result; // 记录全部结果

函数返回的类型是 void, 组合 — — startindex

void backtracking(vector<int>& nums, int startindex)

递归结束的条件

由于是要收集每个节点上的数据, 所以我们就可以不用写条件, 直接收录

result.push_back(path);

单层逻辑

单层逻辑 和 回溯组合中的 单层逻辑是一样的

for(int i = startindex; i < nums.size(); i++)
{
	path.push_back(nums[i]);
	backtracking(nums, i + 1);
	path.pop_back();
}

代码

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
 
    void backtracking(vector<int>& nums, int startindex)
    {
        result.push_back(path);
        
        for(int i = startindex; i < nums.size(); i++)
        {
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
    
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        backtracking(nums, 0);
        return result;
        
    }
};

子集II

力扣链接

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0]
输出:[[],[0]]

  • 提示:
    1 <= nums.length <= 10
    -10 <= nums[i] <= 10

题目理解

哈哈, 跟上面的子集大体上是一样的, 唯一不同的是 有重复的元素 && 解集不能包含重复的子集
那么下一步的操作肯定就是 去重

步骤

树形结构


从上面的树形图可以看出:

  • 同一树层上的 2 要去重 — — 树层去重
  • 同一树枝上的 2 不能去重 — — 树枝不去重
  • 树层去重, 树枝不去重的原因:
    树层去重 — — 因为已经排序, 那么第一个 2 具有的组合 包含了后面的 2 具有的组合
    树枝不去重 — — 因为 [1, 2 ] 和 [1, 2, 2] 是两个不同的结果, 一个是第一个 2, 一个是第二个 2

递归函数

首先, 还是两个全局变量, 一个记录单层结果, 一个记录全部结果

vector<int> path; // 记录单层结果
vector<vector<int>> result; // 记录全部结果

函数返回的类型是 void
组合 — — startindex
去重 — — used数组

void backtracking(vector<int>& nums, vector<bool>& used, int startindex)

递归结束的条件

由于是要收集每个节点上的数据, 所以我们就可以不用写条件, 直接收录

result.push_back(path);

单层逻辑

子集 + 去重

  for(int i = startindex; i < nums.size(); i++)
  {
      // 树层去重, 树枝不去重的关键
      if(i > 0 && ( nums[i] == nums[i - 1] ) && (used[i - 1] == false))
      {
          continue;
      }
      
      path.push_back(nums[i]);
      used[i] = true;
      backtracking(nums, used, i + 1);
      path.pop_back();
      used[i] = false;
  }

代码

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    
    void backtracking(vector<int>& nums, vector<bool>& used, int startindex)
    {
        // 子集是搜集每一个节点, 不需要结束条件
        result.push_back(path);
        
        for(int i = startindex; i < nums.size(); i++)
        {
            // 树层去重, 树枝不去重的关键
            if(i > 0 && ( nums[i] == nums[i - 1] ) && (used[i - 1] == false))
            {
                continue;
            }
            
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums, used, i + 1);
            path.pop_back();
            used[i] = false;
        }
    }
    
    vector<vector<int>> subsetsWithDup(vector<int>& nums) 
    {
        vector<bool> used(nums.size(), false);
        sort(nums.begin(), nums.end());  // 排序很重要
        backtracking(nums, used, 0);
        
        return result;
        
    }
};

要人家服,只能说服,不能压服;压服的结果总是压而不服;以力服人是不行的 — — 毛泽东

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL索引、事务、与存储引擎

MySQL索引、事务、与存储引擎 一、索引 1.概念 索引是一个排序的列表&#xff0c;包含索引字段的值和其相对应的行数据所在的物理地址2.作用 优点 加快表的查询速度 可以对字段排序缺点 额外占用磁盘空间 更新包含索引的表效率会更慢3.索引工作模式 没有索引的情况下&am…

利用C语言创建图书管理系统

不仅仅是图书信息管理系统 基于双链表&#xff0c;采用面向对象编程方法制作的图书管理系统 ❞ 效果演示 root用户&#xff1a;账号&#xff1a;0&#xff0c;密码&#xff1a;0 普通用户&#xff1a;账号&#xff1a;1001&#xff0c;密码&#xff1a;666666 图书信息 没有完全…

Spring MVC各种参数进行封装

目录 一、简单数据类型 1.1 控制器方法 1.2 测试结果 二、对象类型 2.1 单个对象 2.1.1 控制器方法 2.1.2 测试结果 2.2 关联对象 2.2.1 控制器方法 2.2.2 测试结果 三、集合类型 3.1 简单数据类型集合 3.1.1 控制方法 3.1.2 测试结果 3.2 对象数据类型集合 3.…

KMP算法实现strStr(c++代码实现)

1 KMP算法简介 KMP算法是一个解决字符串匹配问题的算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出。当给你一个主串str和一个子串substr&#xff0c;如何确定substr在主串中出现的位置&#xff1f;如果没有学习KMP算法&#xff0c;我们可能会写出这样的代…

测试(三)——黑盒测试

一、测试用例的基本要素 测试环境、操作步骤、测试数据、预期结果 测试用例的好处&#xff1a; 1.能提高测试效率、节省测试时间 2.测试用例是自动化测试用例的前提 二、测试用例的设计方法 2.1基于需求进行测试用例设计 2.2具体的设计方法 2.2.1等价类 有效等价类&#x…

c++学生信息管理系统

前言 c课程作业–学生信息管理系统 在 原博客C通讯录管理系统 https://www.csdn.net/tags/OtDagg2sODU2Ni1ibG9n.html 的基础上进行了一点修改。 学生信息管理系统 基本功能要求&#xff1a; 能使用文件的打开&#xff0c;关闭&#xff0c;读写等操作&#xff0c;实现 1.连…

STM32单片机(六)TIM定时器 -> 第八节:TIM编码器练习(编码器接口测速)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

Linux学习入门笔记

计算机硬件 计算机五大基本部件 控制器 -----> 协调各个部件运算器 -----> 算术、逻辑运算存储单元 ----->内存、外存输入单元输出单元 cup 由控制器、运算器组成 计算机操作系统 操作系统 OS 管理和控制计算机系统中的硬件和软件资源&#xff0c;用于在用户与系统…

gitLens插件简单使用

1.安装 在vscode中的插件管理输入如下后下载 GitLens — Git supercharged 2.配置 点击文件--首选项--设置 点击右上角设置小图标 3.github使用 首先仓库文件一定是要git init是git所管理的 1.在代码文件夹下使用git init创建仓库 2.打开vscode的git管理 3.点击添加暂存区…

Triton教程 --- 优化

Triton教程 — 优化 文章目录 Triton教程 --- 优化优化设置动态批处理程序模型实例 特定于框架的优化带有 TensorRT 优化的 ONNX (ORT-TRT)具有 OpenVINO 优化的 ONNXTensorFlow 与 TensorRT 优化 (TF-TRT)TensorFlow JIT 图优化TensorFlow 自动 FP16 优化 NUMA优化主机策略 Tr…

python找出所有重复数字的三位数(如110)注意重复数字(如111除外) ​要求打印所有满足条件的三位数及个数,每行打印五个

一、编程题目 python找出所有重复数字的三位数&#xff08;如110&#xff09;注意重复数字&#xff08;如111除外&#xff09; ​要求打印所有满足条件的三位数及个数&#xff0c;每行打印五个。 二、实现思路 要实现判断数字是否重复&#xff0c;脑袋里的第一反应就是使用循环…

在办公套件 ONLYOFFICE 中使用 AI 插件:自动生成文本/图片、单词释义、翻译等

想必大家多少都体验过各种人工智能应用&#xff0c;它们跟办公套件结合简直就是打工人和学生们的王炸。除了在Office全家桶中可以使用AI插件&#xff0c;在开源办公套件 ONLYOFFICE 中也能使用它。 什么是 ONLYOFFICE ONLYOFFICE 是一个开源办公套件&#xff0c;由总部位于总部…

OpenMMLab-AI实战营第二期-课程笔记-Class 4:深度学习预训练与MMPretrain

Class4&#xff1a;深度学习预训练与MMPretrain 课程链接&#xff1a;深度学习预训练与MMPretrain_哔哩哔哩_bilibili 相关repo&#xff1a;open-mmlab/mmpretrain: OpenMMLab Pre-training Toolbox and Benchmark (github.com) 文章目录 Class4&#xff1a;深度学习预训练与MM…

系统工程 - 记录一次调试USB设备低功耗应用的过程

系统工程 - 记录一次调试USB设备低功耗应用的过程 文章目录 系统工程 - 记录一次调试USB设备低功耗应用的过程需求功耗测量方法分析功耗来源LED功耗MCU功耗板子漏电 软件改善功耗调整tinyusb协议栈源码降低主频电脑唤醒usb设备退出低功耗进入STOP模式 总结 需求 最近在同客户做…

【Python 随练】寻找完数

题目&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如 61&#xff0b;2&#xff0b;3.编程找出 1000 以内的所有完数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个数学问题&#xff1a;如何找出 1000 以内的所有…

Stable diffusion WebUI txt2img使用教学

本篇文章将深入探讨如何在Stable Diffusion WebUI上进行各项参数的调整。将以txt2img为主要讨论对象&#xff0c;探讨诸如基本设定Sampling method以及CFG scale等参数的调整&#xff0c;以及这些参数之间的相互影响。 对于还未安装Stable Diffusion WebUI的小伙伴&#xff0c…

httpd的安装和mysql数据库的安装方法

目录 一 安装httpd 1.下载httpd包模块apr和apr-u到opt目录 2. 解包 3. 把apr和apr-u包放在http的第三方模块scrilb目录中 4.进入httpd包的安装目录并安装依赖环境和进行编译安装 5. make -j 2 && make install 编译并安装 6.优化配置文件 7. 把httpd服务放在sy…

智能文档图像处理技术:解决大数据时代文档图像处理难题

智能文档图像处理技术&#xff1a;解决大数据时代文档图像处理难题 0. 前言1. 智能文档处理1.1 智能文档处理简介1.2 智能文档处理应用 2. VALSE 视觉与学习青年学者研讨会2.1 VALSE 20232.2 合合信息亮相 VALSE 2023 3. 版面分析技术3.1 版面分析3.2 文档还原 4. 其他相关智能…

Gamma:强大的AI制作PPT神器,用完再也回不去了!

看过许多 AI 制作 PPT 软件&#xff0c;最终还是被 Gamma 惊艳到。 Gamma 是一款基于人工智能技术的 PPT 制作工具&#xff0c;可以帮助用户轻松制作高质量的 PPT 演示文稿。 痛点解决 相比传统制作 PPT 方式&#xff0c;Gamma 可以解决哪些如下 7 个痛点&#xff1a; 一句话…

2016年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2016年1月真题&#xff1a; 四、写作&#xff1a;第56~57小题&#xff0c;共65 分。其中论证有效性分析30 分&#xff0c;论说文35分。 56、论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0…