leetcode_78子集
1. 题意
给定一个不含有重复数字的数列,求所有的子集。
2. 题解
子集型回溯,可以直接用dfs进行搜索;也可以用二进制来进行枚举。
2.1 选或不选
class Solution {
public:
void dfs(vector<vector<int>> &ans,vector<int> &tmp,
vector<int> &nums, int depth) {
if (depth == nums.size()) {
ans.emplace_back(tmp );
return;
}
dfs(ans, tmp, nums, depth + 1);
tmp.push_back(nums[depth]);
dfs(ans, tmp, nums, depth + 1);
tmp.pop_back();
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> tmp;
dfs( ans, tmp, nums, 0);
return ans;
}
};
2.2 选哪个
class Solution {
public:
void dfs(vector<vector<int>> &ans,vector<int> &tmp,
vector<int> &nums, int depth) {
ans.emplace_back(tmp);
for (int i = depth;i < nums.size(); i++) {
tmp.push_back(nums[i]);
dfs(ans, tmp, nums, i + 1);
tmp.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> tmp;
dfs( ans, tmp, nums, 0);
return ans;
}
};
2.3 二进制枚举
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
int sz = nums.size();
for (int i = 0;i < (1 << sz); i++) {
vector<int> tmp;
for (int j = 0;j < sz;j++) {
if (i & (1 << j))
tmp.push_back(nums[j]);
}
ans.emplace_back( tmp );
}
return ans;
}
};
参考
0x3f题解