半途放入
回溯只要去掉一个
到最后时结果就都在res中了
k是子集中的第k个,start是第k个数可以从哪儿开始取,在前面一样的情况下第k个值不要取相同的
因为相同值第一个取过后,start比后面相同值都较小,所以选择性更多,后面重复的值可跳过
C++ 代码
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<int> temp;
sort(nums.begin(), nums.end());
dfs(nums, 0, 0, temp);
return res;
}
void dfs(vector<int>& nums, int k, int start, vector<int>& temp){
//start值会控制是否进入循环,从而返回
res.push_back(temp);
for(int i = start; i < nums.size(); i++){
if(i > start && nums[i] == nums[i-1]) continue;
temp.push_back(nums[i]);
dfs(nums, k + 1, i + 1, temp);
temp.pop_back();
}
}
};