第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值。

level代表的是需要进行选择的数值的位置。

78. Subsets

错误解法:

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsets(vector<int>& nums) {
  4. vector<vector<int> > result;
  5. if(nums.empty())
  6. return result;
  7. vector<int> res;
  8. int level = ;
  9. subsets(nums,result,res,level);
  10. return result;
  11. }
  12. void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
  13. result.push_back(res);
  14. for(int i = level;i < nums.size();i++){
  15. res.push_back(nums[i]);
  16. subsets(nums,result,res,level+);
  17. res.pop_back();
  18. }
  19. return;
  20. }
  21. };

如果只看代码本身,不看继续的递归,整个for循环执行完成是同一层的所有节点。

level是同一层初始的开始,对于同一层来说是一个固定值。

正确解法:

时间复杂度2的n次方*n

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsets(vector<int>& nums) {
  4. vector<vector<int> > result;
  5. if(nums.empty())
  6. return result;
  7. vector<int> res;
  8. int level = ;
  9. subsets(nums,result,res,level);
  10. return result;
  11. }
  12. void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
  13. result.push_back(res);
  14. for(int i = level;i < nums.size();i++){
  15. res.push_back(nums[i]);
  16. subsets(nums,result,res,i+);
  17. res.pop_back();
  18. }
  19. return;
  20. }
  21. };

错误解法:

如果是[1,2,3]这个数组,输出的结果不会包含任何一个含有3的子数组

subset的题目必须将每个搜索的节点存储,这个代码每次是在下一个迭代中(即i+1)将上一次的结果进行存储,所以当level=2时把3存入res时,只有在level = 3时才会将这个搜索存入result。

修改的办法要么是直接删除if判断,要么是在if判断中加入result.push_back(res);

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsets(vector<int>& nums) {
  4. vector<vector<int>> result;
  5. if(nums.empty())
  6. return result;
  7. vector<int> res;
  8. int level = ;
  9. subsets(nums,result,res,level);
  10. return result;
  11. }
  12. void subsets(vector<int> nums,vector<vector<int>>& result,vector<int> res,int level){
  13. if(level == nums.size()){
  14. return;
  15. }
  16. result.push_back(res);
  17. for(int i = level;i < nums.size();i++){
  18. res.push_back(nums[i]);
  19. subsets(nums,result,res,i+);
  20. res.pop_back();
  21. }
  22. }
  23. };

90. Subsets II

先用sort排序,是为了利用相同数值紧邻。

在整个过程中,在回溯回来的过程中,才会考虑相同的数值跳过。

从搜索树来看,实际上只在同一层进行相同数值判断,而每一层的节点都是通过回溯得到的。错误的解法是在每一个节点都进行判断。

错误解法:

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsetsWithDup(vector<int>& nums) {
  4. vector<vector<int> > result;
  5. if(nums.empty())
  6. return result;
  7. vector<int> res;
  8. int level;
  9. sort(nums.begin(),nums.end());
  10. subsets(nums,result,res,level);
  11. return result;
  12. }
  13. void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
  14. result.push_back(res);
  15. for(int i = level;i < nums.size();i++){
  16. if(i > && nums[i] == nums[i-])
  17. continue;
  18. res.push_back(nums[i]);
  19. subsets(nums,result,res,i+);
  20. res.pop_back();
  21. }
  22. return;
  23. }
  24. };

正确解法:

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsetsWithDup(vector<int>& nums) {
  4. vector<vector<int> > result;
  5. if(nums.empty())
  6. return result;
  7. vector<int> res;
  8. int level = ;
  9. sort(nums.begin(),nums.end());
  10. subsets(nums,result,res,level);
  11. return result;
  12. }
  13. void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
  14. result.push_back(res);
  15. for(int i = level;i < nums.size();i++){
  16. res.push_back(nums[i]);
  17. subsets(nums,result,res,i+);
  18. res.pop_back();
  19. while(i < nums.size() - && nums[i+] == nums[i])
  20. i++;
  21. }
  22. return;
  23. }
  24. };

leetcode 78. Subsets 、90. Subsets II的更多相关文章

  1. 78. Subsets(M) & 90. Subsets II(M) & 131. Palindrome Partitioning

    78. Subsets Given a set of distinct integers, nums, return all possible subsets. Note: The solution ...

  2. leetcode 51. N-Queens 、52. N-Queens II

    51. N-Queens 使用isValid判断当前的位置是否合法 每次遍历一行,使用queenCol记录之前行的存储位置,一方面是用于判断合法,另一方面可以根据存储结果输出最终的结果 class S ...

  3. Leetcode之回溯法专题-90. 子集 II(Subsets II)

    Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...

  4. [LeetCode] 90.Subsets II tag: backtracking

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  5. [leetcode]90. Subsets II数组子集(有重)

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  6. [LeetCode] 90. Subsets II 子集合 II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  7. LeetCode Problem 90. Subsets II

    python solution 123456789101112131415161718192021222324252627 class (object): def subsetsWithDup(sel ...

  8. 【LeetCode】90.Subsets II

    Subsets II Given a collection of integers that might contain duplicates, nums, return all possible s ...

  9. LeetCode 78. 子集(Subsets) 34

    78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...

随机推荐

  1. PHP读取配置文件连接MySQL数据库

    读取配置文件方法parse_ini_file($filepath [,$section]) 代码: conn.php <?php //连接数据库 //$conn =new mysqli('loc ...

  2. Halcon学习笔记——条形码的定位与识别

    一维码的原理与结构 条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息. 一维条码数据结构,分四个区域.组成分别为静区.起始/终止符.校验符.数据符. 一维条码 ...

  3. 流畅的python和cookbook学习笔记(八)

    1.函数的默认参数必须不可变 如果函数的默认参数为可变的对象,那么默认参数在函数外被修改也会影响到函数本身的. >>> def spam(a, b=None): # b要为不可变参数 ...

  4. 解决maven项目中,缺少 maven dependencies

    因为项目需要将普通项目转换为maven项目,在右键 ’项目‘configure 后,添加maven后,发现缺少 maven dependencies,于是从网上找了一些处理措施,大体上是在.class ...

  5. JavaScript中解决多浏览器兼容性问题的方案

    一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...

  6. UNION ALL 视图 'ImprotHIS2012.dbo.ImportHISData' 不可更新,因为没有找到分区依据列。 Severity 16 State 12

    -- 3 更正措施,使约束check一次 Alter Table ImprotHIS_Bak_2011.dbo.ImportHISData with check Check Constraint al ...

  7. Effective C++ .17 函数调用时的资源管理

    以书上的代码为例 processWidget(shared_ptr<Widget>(new Widget), priority()) 虽然使用了智能指针来管理资源但是,由于参数值计算顺序的 ...

  8. 原生JS编写getByClass、addClass、removeClass、hasClass

    前言: 年后换了工作,在现在的公司写交互主要使用JS原生:刚刚入门前端的时候写交互一直用的原生JS,虽然用的不怎么样.后来去之前的公司之后,leader主张把jQuery用好,JS原生自然就熟练了:一 ...

  9. csharp:Learn how to post JSON string to generic Handler using jQuery in ASP.Net C#.

    /// <summary> ///參考: http://james.newtonking.com/json/help/index.html# /// 塗聚文(Geovin Du) 2014 ...

  10. Web前端面试指导(十九):CSS样式-如何清除元素浮动?

    题目点评 本题属于比较常问的题目,也是在网页设计中经常遇到的问题,面试官希望通过这样的面试题来了解你对网页设计的基本功底,如果这样的题目答不出来,必会让面试官大失所望,面试成功的概率是非常小的. 答题 ...