算法1
思路:像全排列问题,一般的思路就是深搜
这种可能含有重复数字的处理,就是遍历所有数,来一个cnt[x]++;
将第一个数-10放到递归函数里面,得到的答案就是本题的答案,关于本题中的dfs()解释一下,我们需要搜索树的范围是-10到10,所以递归搜索大于10,就结束,把每次的递归搜索路径,放到path里面,对于每一个数都进行dfs,然后把路径存在数组里,递归完这一个数,然后需要返回上一层
C++ 代码
class Solution {
public:
unordered_map<int,int> cnt;
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
for(auto x:nums)cnt[x]++;//枚举每一个数,因为可能包含重复数
dfs(-10);//数字从-10开始
return ans;
}
void dfs(int u)
{
if(u>10)ans.push_back(path);//如果当前步数超过10,直接把路径输入
else{
for(int i=0;i<cnt[u]+1;i++)//一共有cnt+1种选法
{
dfs(u+1);//对于每个数dfs一下
path.push_back(u);//然后加到数组里
}
for(int i=0;i<cnt[u]+1;i++)
{
path.pop_back();//恢复现场
}
}
}
};