回溯算法:子集II
思路:该题为子集问题,与之前“组合总和问题II”的去重思想一致,即相同一层不能有相同的元素,因此去重逻辑:if(i > startIdex && nums[i] == nums[i - 1])
不变,注意要先排序,将相同元素放在一起
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
int startIdex = 0;
res.push_back(path);
sort(nums.begin(), nums.end());
backtrack(nums, startIdex);
return res;
}
void backtrack(vector<int>& nums, int startIdex)
{
//退出条件
if(startIdex >= nums.size())
{
return;
}
//单层循环条件
for(int i = startIdex; i < nums.size(); i++)
{
//去除同层相同元素
if(i > startIdex && nums[i] == nums[i - 1])
{
continue;
}
//
path.push_back(nums[i]);
res.push_back(path);
//递归到下一层
backtrack(nums, i+1);
//回溯
path.pop_back();
}
}
};