LeetCode 90 子集 II - 回溯解法
https://leetcode.cn/problems/subsets-ii/description/
和 [组合总和2](LeetCode 40 组合总和 II - 回溯解法.md) 类似.
思路
仍然是 从index 到最后选一个数 i 加入path,再从 i 之后到最后选一个数加入到path中,
只不过这里需要去重, 方法和 [组合总和2](LeetCode 40 组合总和 II - 回溯解法.md) 一样, 这里的重复是for 循环时 所取的 loc_nums[i] 与上一个重复了, 所以设置 last 标记上一次的选值, 当本次选的和上一次选的值重复时就跳过(这里就要求排序了).
last = 11 题目说 数值大小不会超过10, 这里取一个不会取到的值
for(int i = index; i<max;i++){
if(loc[i]==last) continue;
path.push(loc[i])
add_path(i+1);
path.pop()
}
代码
class Solution {
public:
vector<int> loc_nums;
vector<int> path;
vector<vector<int>> result;
void add_path(int index){
if(path.size()>0) result.push_back(path);
int last = 11;
for(int i = index;i<loc_nums.size();i++){
if(loc_nums[i]==last) continue;
last = loc_nums[i];
path.push_back(loc_nums[i]);
add_path(i+1);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
loc_nums = nums;
sort(loc_nums.begin(), loc_nums.end());
add_path(0);
vector<int> tmp;
result.push_back(tmp);
return result;
}
};