回溯法:子集
睡不醒的鲤鱼 2021-12-26 每日一题 LeetCode
# 0078. 子集 (opens new window)
题目
给你一个整数数组 nums,数组中的元素互不相同,返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集,你可以按任意顺序返回解集。
解析
枚举每个元素是否选择,遍历到最后一个元素结束搜索。
代码
class Solution {
vector<vector<int>> ans;
vector<int> subset;
public:
vector<vector<int>> subsets(vector<int>& nums) {
dfs(nums, 0);
return ans;
}
void dfs(vector<int>& nums, int idx) {
if (idx == nums.size()) {
ans.push_back(subset);
return;
}
// 选择当前元素
subset.push_back(nums[idx]);
dfs(nums, idx + 1);
// 丢弃当前元素
subset.pop_back();
dfs(nums, idx + 1);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 0090. 子集 II (opens new window)
题目
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
统计每个数字出现的次数 k,尝试枚举每个不同的数字,尝试把 0 到 k 个数字加入子集即可。
代码
方法一:排序计数
class Solution {
vector<vector<int>> ans;
vector<int> subset;
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
dfs(nums, 0);
return ans;
}
void dfs(vector<int>& nums, int idx) {
if (idx == nums.size()) {
ans.push_back(subset);
return;
}
int k = idx + 1;
while (k < nums.size() && nums[k] == nums[idx]) k++;
for (int i = 0; i <= k - idx; i++) {
dfs(nums, k);
subset.push_back(nums[idx]);
}
for (int i = 0; i <= k - idx; i++) {
subset.pop_back();
}
}
};
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
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
方法二:哈希表计数
class Solution {
vector<vector<int>> ans;
vector<int> subset;
unordered_map<int, int> cnt;
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) cnt[nums[i]]++;
dfs(cnt.begin());
return ans;
}
void dfs(unordered_map<int, int>::iterator it) {
if (it == cnt.end()) {
ans.push_back(subset);
return;
}
int num = it->first, cnt = it->second;
auto next = ++it;
for (int i = 0; i <= cnt; i++) {
dfs(next);
subset.push_back(num);
}
for (int i = 0; i <= cnt; i++) {
subset.pop_back();
}
}
};
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
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