可以看到如果不使用排序则只能保证收取叶子节点是不重复的。
class Solution {
public:
vector<int> subset;
vector<vector<int>> result;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
subset.clear();
result.clear();
sort(nums.begin(), nums.end());//使用set收集叶子节点可以不用排序,但是收集的是任意结点需要排序(原因看笔记)
backchecking(nums, 0);
return result;
}
void backchecking(vector<int>& nums, int start) {
result.push_back(subset);
unordered_set<int> uset;
for (int i = start; i < nums.size(); i++) {
if (uset.find(nums[i]) != uset.end()) { // 避免出现多次类似[2],[2],而保留[2,2]
continue;
}
uset.insert(nums[i]);//只对for这层有效,即树层去重
subset.push_back(nums[i]);
backchecking(nums, i + 1);
subset.pop_back();
}
}
};