LeetCode刷题day46 |
您所在的位置:网站首页 › 爱编程的大李子 › LeetCode刷题day46 |
文章目录
78. 子集题目描述思路分析参考代码
90. 子集 II题目描述思路分析参考代码
491. 递增子序列题目描述思路分析参考代码
46. 全排列题目描述思路分析参考代码
47. 全排列 II题目描述思路分析参考代码
78. 子集
题目描述
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2: 输入:nums = [0] 输出:[[],[0]] 思路分析如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点! 子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。 那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始! 以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下: 回溯三部曲 确定递归参数和返回值递归参数:需要遍历的数组 vector &nums,每层遍历的起始下标startIndex . 返回值:由于定义全局变量来保存最终结果集以及单一结果,所以并不需要返回值. 确定结束条件由于这次是寻找所有的组合,所以并不需要结束条件.没递归一层就把对应的结果放入到结果集中. 确定单层递归逻辑将当前组合数加入单一结果集,递归,回来后进行回溯.进行下一次循环. 参考代码 #include using namespace std; vector result; vector path; void backtracking(vector &nums,int startIndex){ result.push_back(path); for(int i = startIndex; i uset更新=>递归=>回溯=>循环下一个数. 如果不是,则进入跳过当前的数,进行下一个循环.备注:因为 -100 = 2 的. } unordered_set uset;//用于去重 for(int i = startIndex; i 递归=>回溯=>循环下一个数 注意:used数组常用于组合中树层/树枝的去重(常伴随着元素先排序), 也常用于排列中数据的标记. ordered_set常用于进行树层去重. 参考代码 vector path; vector result; void backtracking(vector&nums,vector& used){//used用于取没有使用过的元素 if(path.size()==nums.size()){ result.push_back(path); return; } for(int i = 0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |