方法1:按照Subsets I 的方法做,解出子集后去重
方法2:前一部分的解题思路和Subsets I一样,对于重复的元素,记录每个数字重复出现的次数,进行组合,例如对于1,2,2,由于2出现了两次,所以可能的组合是不选2,选一个2,选两个2,这样得到的结果就是 空集; 1 ; 2,; 1,2 ; 2,2; 1,2,2;
class Solution {
public:
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > totalset = {{}};
sort(S.begin(),S.end());
for(int i=0; i<S.size();){
int count = 0; // num of elements are the same
while(count + i<S.size() && S[count+i]==S[i]) count++;
int previousN = totalset.size();
for(int k=0; k<previousN; k++){
vector<int> instance = totalset[k];
for(int j=0; j<count; j++){
instance.push_back(S[i]);
totalset.push_back(instance);
}
}
i += count;
}
return totalset;
}
};
方法3:通过判断条件进行复杂的分枝控制,在迭代过程中减掉重复的分枝
class Solution
{
public:
void sub(vector<vector<int>> &ans, vector<int> &sets, vector<int> &A, int j) {
if (j >= A.size()) {
return;
}
for (int i = j; i<A.size(); i++) {
if (i>j && A[i] == A[i - 1])
continue;
sets.push_back(A[i]);
ans.push_back(sets);
sub(ans, sets, A, i + 1);
sets.pop_back();//利用出栈以及前面的if条件进行剪枝
}
}
vector<vector<int>> subsetsWithDup(vector<int>& A) {
vector<vector<int>> ans;
vector<int> sets;
sort(A.begin(), A.end());
ans.push_back(sets);
sub(ans, sets, A, 0);
return ans;
}
};