leetcode日记(77)子集Ⅱ
- 手机
- 2025-09-10 16:21:02

不知道为什么看到这道题就很头痛……
其实只要掌握nums不包含重复元素的情况下的代码就行了。
若nums不能包含重复元素,那么使用回溯很容易就能写出来:
class Solution { void hs(vector<int> v,int x,vector<int> r,vector<vector<int>>& result){ if(x==v.size()){ result.push_back(r); r.clear(); return ; } r.push_back(v[x]); hs(v,x+1,r,result); r.pop_back(); hs(v,x+1,r,result); } public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<int> r; vector<vector<int>> result; hs(nums,0,r,result); return result; } };一开始我在回溯的函数里鬼使神差写了一个循环导致结果多出一大堆……以后可千万不能犯这样的低级错误了…………
接着就是考虑nums中能有重复元素的情况,这种情况下若重复元素上一个相同元素没有选上,那么以后的这个元素也不能选,知道这个原理就可以将nums排序,让重复元素互相挨着,每次不选上一个元素,若下一个元素还是这个元素就跳过不取。
class Solution { void hs(vector<int> v,int x,vector<int> r,vector<vector<int>>& result){ if(x==v.size()){ result.push_back(r); r.clear(); return ; } r.push_back(v[x]); hs(v,x+1,r,result); r.pop_back(); for(int i=x;i<v.size()-1;i++){ if(v[x]==v[x+1]) x++; } hs(v,x+1,r,result); } public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<int> r; vector<vector<int>> result; sort(nums.begin(),nums.end()); hs(nums,0,r,result); return result; } };leetcode日记(77)子集Ⅱ由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“leetcode日记(77)子集Ⅱ”
上一篇
*动态规划(4)