这里选取LeetCode两道子集生成的问题
LC 78. 子集(集合中无重复元素)
DFS
const int N = 15;
class Solution {
public:
bool vis[N];
vector<vector<int>> ans;
void dfs(vector<int>& nums, int x) {
if (x == nums.size()) {
vector<int> part;
for (int i = 0; i < N; i ++ )
if (vis[i]) part.push_back(nums[i]);
ans.push_back(part);
return ;
}
vis[x] = true;
dfs(nums, x + 1);
vis[x] = false;
dfs(nums, x + 1);
}
vector<vector<int>> subsets(vector<int>& nums) {
memset(vis, 0, sizeof vis);
dfs(nums, 0);
return ans;
}
};
二进制枚举方法(推荐)
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
vector<int> part;
vector<vector<int>> ans;
for (int i = 0; i < (1 << n); i ++ ) {
part.clear();
for (int j = 0; j < n; j ++ ) {
if (i >> j & 1) part.push_back(nums[j]);
}
ans.push_back(part);
}
return ans;
LC 90. 子集II(集合包含重复元素)
DFS
class Solution {
public:
vector<vector<int>> ans;
vector<int> part;
void dfs(vector<int>& nums, int x) {
if (x == nums.size()) {
ans.push_back(part);
return ;
}
int y = x + 1;
while (y < nums.size() && nums[y] == nums[x]) y ++ ;
for (int k = 0; k <= y - x; k ++ ) {
dfs(nums, y);
part.push_back(nums[x]);
}
for (int k = 0; k <= y - x; k ++ ) part.pop_back();
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
dfs(nums, 0);
return ans;
}
};