90. 子集 II(LeetCode)(dfs)
因为元素可能会重复,且要求输出的组合不能重复,所以不能像子集再使用二进制方式去枚举
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
//按顺序选
sort(nums.begin(), nums.end());
dfs(nums, 0);
return ans;
}
void dfs(vector<int>& nums, int u){
if(u == nums.size()){
ans.push_back(path);
return;
}
int t = u + 1;
while(t < nums.size() && nums[t] == nums[u]) ++t;
//枚举选该元素多少个
for(int i = 0; i <= t - u; ++i){
//枚举下一段k,不含该段
dfs(nums, t);
//在枚举的过程中增加该元素个数
path.push_back(nums[u]);
}
for(int i = 0; i <= t - u; ++i){
path.pop_back();
}
}
};

浙公网安备 33010602011771号