【LintCode】 – Subsets II
和上一道题一脉相承,就是逻辑有点绕。
说下思路,也是dfs书,只不过要加一些判断。
比如说[1,2,2]这个输入,当处理到第二个2的时候,要判断前面是否添加了第1个2,如果添加了才能把这个2添加进去。如下面这个图。
只有前面添加了,才可能添加重复的2,要不然会变成重复元素。
推广一下,当添加第n个重复元素的时候,要先判断这个vector末尾开始是不是有n-1个这个元素,如果有的话就可以添加,如果没有则不添加。
class Solution {
private:
vector<vector<int>> so;
public:
/**
* @param nums: A set of numbers
* @return: A list of lists
*/
vector<vector<int>> subsetsWithDup(vector<int> &nums) {
// write your code here
sort(nums.begin(), nums.end());
vector<int> temp;
dfs(nums, 0, temp);
return so;
}
void dfs(vector<int> &nums, int dp, vector<int> &temp){
if(dp == nums.size()){
so.push_back(temp);
return;
}
//先判断是否是连续添加的元素
int samenum = 0;
for(int i=dp-1; i>=0; i--){
if(nums[i] == nums[dp])
samenum++;
else
break;
}
//如果是连续的
if(samenum){
//找出在结尾位置前面有连续samenum个nums[dp]的temp
int len = temp.size();
int k = 0;
for(int i=len-1; i>=0; i--){
if(temp[i] == nums[dp])
k++;
else
break;
}
if(k == samenum){
//加
temp.push_back(nums[dp]);
dfs(nums, dp+1, temp);
temp.pop_back();
}
dfs(nums, dp+1, temp);
}
else{
//加
temp.push_back(nums[dp]);
dfs(nums, dp+1, temp);
temp.pop_back();
//不加
dfs(nums, dp+1, temp);
}
}
};