90. 子集 II - 力扣(LeetCode) (leetcode-cn.com)
这里的数据范围比较小,所以可以直接用暴搜,利用st[N]数组记录第i个数是否被选中1为选0为不选,因为可能存在重复的情况,所以我们得将子集排列并用unordered_map消重。
具体代码如下;
const int N=11;
vector<vector<int>> ans(1);
class Solution {
public:
int st[N];
unordered_map<string,int> ha;
void dfs(vector<int> a,int c,int max){
if(c==max){
vector<int> mid;
string jud;//将答案映射成字符串,用于unordered_map制作key
for(int i=0;i<max;i++){
if(st[i]){
mid.push_back(a[i]);
jud+=a[i]+'0';
}
}
sort(jud.begin(),jud.end());
if(!ha.count(jud))
ans.push_back(mid),ha[jud]=1;
return;
}
st[c]=1;//选
dfs(a,c+1,max);
st[c]=0;//不选
dfs(a,c+1,max);
return ;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
ha.clear();
ans.clear();
dfs(nums,0,nums.size());
return ans;
}
};