90 子集 II

本文最后更新于:2022年4月9日 中午

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

1
2
3
4
5
6
7
8
9
10
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

Solution

回溯算法入门级详解

其他子集问题:[78 子集] 、[40 组合总和 II]

  • 回溯法
  • 子集问题,设置 begin 搜索起点,同一层内去重
  • 「注意去重需要先对集合排序」
图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// @lc code=start
class Solution {
private:
vector<vector<int>> res;

void dfs(vector<int>& nums, int start, vector<int>& cur){
res.push_back(cur);

for(int i=start; i<nums.size(); ++i){
if(i>start && nums[i]==nums[i-1])
continue;
cur.push_back(nums[i]);
dfs(nums, i+1, cur);
cur.pop_back();
}
return;
}

public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
if(nums.size()==0) return res;
sort(nums.begin(), nums.end());
vector<int> cur;
dfs(nums, 0, cur);
return res;
}
};
// @lc code=end

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!