dfs搜索
为了保证不重复,所以要保证枚举的顺序,不能枚举了a[k],再枚举k前面的数,所以要排序
搜索顺序是每一个数选0,1,2…k个,k为当前数出现次数,一共有k+1种选法。类似多重背包.
$ 时间复杂度指数级别$
参考文献
lc究极班
AC代码
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void dfs(vector<int>& nums, int u){
//结束
if (u == nums.size()) {
res.push_back(path);
return ;
}
//对于当前数记录有多少个
int k = u;
while (k < nums.size() && nums[k] == nums[u]) k ++;
int cnt = k - u;
//cnt个数,则有cnt+1钟选法
for (int i = 0 ; i <= cnt ; i ++){
dfs(nums, k);
path.push_back(nums[u]);
}
//回溯
for (int i = 0 ; i <= cnt ; i ++){
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());//保证顺序
dfs(nums, 0);
return res;
}
};