回溯算法11:子集
创始人
2024-06-02 21:22:53
0

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。
转载代码随想录
原文链接:
代码随想录
leetcode链接:78.子集

题目:

给你一个整数数组 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 中的所有元素 互不相同

思路:

求子集问题和77.组合和131.分割回文串又不一样了。

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

有同学问了,什么时候for可以从0开始呢?

求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。

以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下:
在这里插入图片描述

从图中红线部分,可以看出遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合。

回溯三部曲

递归函数参数

全局变量数组path为子集收集元素,二维数组result存放子集组合。(也可以放到递归函数参数里)

递归函数参数在上面讲到了,需要startIndex。

代码如下:

vector> result;
vector path;
void backtracking(vector& nums, int startIndex) {

递归终止条件

从图中可以看出:
在这里插入图片描述

剩余集合为空的时候,就是叶子节点。

那么什么时候剩余集合为空呢?

就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了,代码如下:

if (startIndex >= nums.size()) {return;
}

其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了。

单层搜索逻辑

求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树。

那么单层递归逻辑代码如下:

for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);    // 子集收集元素backtracking(nums, i + 1);  // 注意从i+1开始,元素不重复取path.pop_back();            // 回溯
}

C++代码

根据回溯算法模板:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

可以写出如下回溯算法C++代码:

class Solution {
private:vector> result;vector path;void backtracking(vector& nums, int startIndex) {result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自己if (startIndex >= nums.size()) { // 终止条件可以不加return;}for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector> subsets(vector& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

在注释中,可以发现可以不写终止条件,因为本来我们就要遍历整棵树。

有的同学可能担心不写终止条件会不会无限递归?

并不会,因为每次递归的下一层就是从i+1开始的。

自己的代码

//2.用位运算
class Solution {
public:vector> subsets(vector& nums) {vector>result;vectorpath;for (int i = 0; i < 1 << nums.size(); ++i) {path.clear();for (int j = 0; j < nums.size(); ++j) {if (i & 1 << j) {path.push_back(nums[j]);}}result.push_back(path);}return result;}
};class Solution {vector>result;vectorpath;void dfs(vector& nums, int startIndex) {result.push_back(path); //第一次来就是把空数组放进去for (int i = startIndex; i < nums.size(); ++i) {path.push_back(nums[i]);dfs(nums, i+1);path.pop_back();}return;}
public:vector> subsets(vector& nums) {dfs(nums, 0);return result;}
};

相关内容

热门资讯

61寸的手机安卓系统,安卓系统... 你有没有想过,如果手机屏幕大到像电视一样,那会是怎样的体验呢?想象61寸的手机安卓系统,是不是瞬间觉...
电脑安卓什么系统好用点,电脑端... 你有没有想过,家里的电脑换成安卓系统会是什么样子?是不是觉得这俩家伙天生八字不合,其实啊,现在市面上...
如何鉴别苹果是安卓系统,如何辨... 你有没有想过,你的手机里那些可爱的应用,它们到底是在苹果的iOS系统里欢快地跳着舞,还是在安卓的大家...
安卓手机查看出厂系统,从生成到... 你有没有想过,你的安卓手机里隐藏着一段不为人知的秘密历史呢?没错,就是它的出厂系统!今天,就让我带你...
安卓系统可用画画软件,激发创意... 你有没有想过,在手机上也能轻松画出心中的世界呢?没错,就是那种可以随时随地拿起手机,就能挥洒创意的画...
安卓系统的问卷调查,洞察用户需... 你知道吗?最近我在网上看到了一份关于安卓系统的问卷调查,结果简直让人大开眼界!这不,我就迫不及待地想...
深度os系统是安卓吗,揭秘其与... 亲爱的读者,你是否曾好奇过,那些运行在我们手机上的操作系统,它们究竟是不是安卓呢?今天,就让我带你一...
安卓上跑windows系统,安... 你有没有想过,在安卓手机上也能体验到Windows系统的魅力呢?没错,这就是今天我要跟你分享的神奇故...
安卓系统自动下载应用,轻松享受... 你有没有发现,手机里的安卓系统有时候会自动下载一些应用,让你有点摸不着头脑呢?这到底是怎么回事呢?今...
安卓系统标志猪图标,揭秘安卓系... 你有没有注意到,安卓系统里那个标志性的猪图标?它可是安卓家族的吉祥物呢!今天,就让我带你来一探究竟,...
touchpad安卓9双系统,... 你有没有想过,你的手机触控板竟然也能玩转安卓9双系统?没错,就是那个我们平时用来滑动、点击的小玩意儿...
安卓系统10多个g,安卓系统1... 你有没有发现,最近你的安卓手机变得越来越“胖”了?没错,说的就是那个安卓系统,它竟然悄悄地膨胀到了1...
三星系统和安卓系统关系,深入解... 你有没有想过,为什么你的手机里装的是三星系统而不是苹果的iOS呢?这背后其实有着一段复杂的故事,三星...
安卓杂牌机刷鸿蒙系统,体验鸿蒙... 你有没有想过,那些在街头巷尾随处可见的安卓杂牌机,竟然也能焕发新生,变身成为鸿蒙系统的忠实拥趸呢?没...
安卓系统变成ios5,系统变革... 你知道吗?最近有个大新闻在科技圈里炸开了锅,那就是安卓系统竟然变成了iOS 5!是的,你没听错,就是...
如何给电脑转安卓系统,电脑变安... 你有没有想过,把你的电脑变成安卓系统,是不是瞬间觉得整个世界都变得不一样了呢?想象你可以在电脑上直接...
云系统安卓系统教程pdf下载地... 你有没有想过,手机里的安卓系统其实就像一个巨大的云系统,里面藏着无数的秘密和宝藏?今天,我就要带你一...
安卓系统同步没打开,揭秘同步设... 亲爱的手机控们,你是否也有过这样的烦恼:明明想要同步手机上的照片、联系人、日历等重要信息,却发现安卓...
安卓系统发热耗电快,安卓手机发... 手机这玩意儿,现在可是咱们生活中不可或缺的好伙伴。但是,你知道吗?有些安卓手机在使用过程中,总是会出...
安卓系统可执行的脚本,Andr... 你有没有想过,你的安卓手机里那些看似普通的APP,其实可能隐藏着强大的脚本执行能力呢?没错,就是那种...