题目描述:
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
解析:
这题的重点在于数组包含重复元素,而结果不能包含重复子集。
解法一:
用set记录子集,最后赋给vector,这样就不用考虑重复元素了。
解法二:
先对数组排序,对与前一个元素相同的元素,跳过不处理,这样就避免了重复子集。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
ans.push_back(vector<int>());
bfs(nums,0);
return ans;
}
void bfs(vector<int>& nums, int index){
for(int i=index;i<nums.size();i++){
if(i!=index && nums[i]==nums[i-1]) continue; //注意i!=index
res.push_back(nums[i]);
ans.push_back(res);
bfs(nums,i+1);
res.pop_back();
}
}
private:
vector<vector<int>> ans;
vector<int> res;
};