leetcode日记(77)子集Ⅱ
不知道为什么看到这道题就很头痛……
其实只要掌握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;
}
};