- 子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
题解
其实用DFS就可以找到所有的子集,每次DFS规定子集的数目,就可以找到所有的子集,麻烦的是怎么判断重复呢?哈哈,排序元素,然后哈希化成一个数字,然后用map标记一下这个数字是否存在,如果存在说明这个子集之前存在过。
AC代码
class Solution {
public:
typedef long long ll;
map<ll,bool>vis;
vector<vector<int>>q;
void dfs(int L,vector<int>nums,int step,int max_step,ll sum,vector<int>path)
{
if(step>=max_step)
{
if(vis.find(sum)==vis.end())
{
vis[sum]=true;
q.push_back(path);
return ;
}
}
for(int i=L;i<nums.size();i++)
{
path.push_back(nums[i]);
sum+=((nums[i]+10)*(ll)pow(10,step));
dfs(i+1,nums,step+1,max_step,sum,path);
sum-=((nums[i]+10)*(ll)pow(10,step));
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<int>path;
for(int max_step=0;max_step<=nums.size();max_step++)
dfs(0,nums,0,max_step,0,path);
return q;
}
};