Subsets II
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
分析:
在上一题[LeetCode]—Subsets 求数组子集基础上,再来分析搜索树。
当处理第三个元素2时,我们只是在{1 2} {2} 这两个集合上做了新的扩展,添加了2,并没有在{1} { }上添加2。如果再来一个2,那我们只应该在{1 2 2} {2 2}上添加新的2 。那么如果我们继续用DFS方法,那么我们处理的集合上有如果该值重复了K次,那应该包含K个该值。显然此时用方法二简单:如果出现重复时,只需要记录下前一层,更改了多少集合就行了,然后对这些集合进行添加;没有重复,照常进行。参见上一题方法二:[LeetCode]—Subsets 求数组子集
class Solution {
public:
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > res(1);
vector<int> tmp;
sort(S.begin(),S.end());
int oldj=0;
int olds=0;
int j; //本层修改的集合个数
for(int i=0;i<S.size();i++){
int n=res.size();
if(i && S[i]==olds) // i为0时,显然不可能有重复,判定不成立
j=oldj;
else j=res.size();
oldj=0; //清0,重新计算
while(j--){
tmp=res[n-1];
tmp.push_back(S[i]);
res.push_back(tmp);
oldj++;
n--;
}
olds=S[i];
}
return res;
}
};