LeetCode90子集II
其实和子集I的区别就是是否有重复元素,朴素的想法就是加入一个set来去重,但是不支持vector,因此需要定义一个vectorhash。然后判断的时候判断set中是否包含排序后的vector。
struct vectorhash{
inline size_t operator()(const vector<int>& v) const{
size_t res = 0;
for(int i : v){
res += 10 * i;
}
return res;
}
};
class Solution {
public:
vector<int> ans;
vector<vector<int>> res;
unordered_set<vector<int>, vectorhash> set;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
dfs(0, nums);
return res;
}
void dfs(int index, vector<int>& nums){
if(index == nums.size()){
vector<int> tmp = ans;
sort(tmp.begin(), tmp.end());
if(!set.count(tmp)){
res.push_back(ans);
set.insert(tmp);
}
return;
}
dfs(index+1, nums);
ans.push_back(nums[index]);
dfs(index+1, nums);
ans.pop_back();
}
};