什么叫网站名称,网站建设编辑教程,网络规划设计师教程第二版电子版,广州有哪些做网站的公司题目链接#xff1a;
力扣#xff08;LeetCode#xff09;官网 - 全球极客挚爱的技术成长平台
思路#xff1a;
如果把 子集问题、组合问题、分割问题都抽象为一棵树的话#xff0c;那么组合问题和分割问题都是收集树的叶子节点#xff0c;而子集问题是找树的所有节点…题目链接
力扣LeetCode官网 - 全球极客挚爱的技术成长平台
思路
如果把 子集问题、组合问题、分割问题都抽象为一棵树的话那么组合问题和分割问题都是收集树的叶子节点而子集问题是找树的所有节点
其实子集也是一种组合问题因为它的集合是无序的子集{1,2} 和 子集{2,1}是一样的。
那么既然是无序取过的元素不会重复取写回溯算法的时候for就要从startIndex开始而不是从0开始
有同学问了什么时候for可以从0开始呢
求排列问题的时候就要从0开始因为集合是有序的{1, 2} 和{2, 1}是两个集合排列问题我们后续的文章就会讲到的。
以示例中nums [1,2,3]为例把求子集抽象为树型结构如下我的代码
class Solution {
public:vectorvectorint result;vectorint path;vectorvectorint subsets(vectorint nums) {backtracking(nums, 0);return result;}void backtracking(vectorint nums, int startIndex){if(startIndex nums.size()){return;}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 {
private:vectorvectorint result;vectorint path;void backtracking(vectorint 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:vectorvectorint subsets(vectorint nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};