题目链接:78. 子集 - 力扣(LeetCode)
要找所有的子集
方法一:二进制状态法
子集就是对于每个元素来说,要么选它要么不选它,用0和1来表示,n个元素就有2的n次方个状态
可以从0数到2的n次方减一,左移再和1做与运算取它对应的位看看是不是1,是1就加上去
代码语言:javascript复制class Solution {
public:
vector<vector<int> > ans;
vector<vector<int> > subsets(vector<int> &nums) {
int n = nums.size();
for (int binary = 0; binary < 1 << n; binary) {
vector<int> son;
for (int i = 0; i < n; i ) {
if (binary >> i & i)
son.push_back(nums[i]);
}
ans.push_back(std::move(son));
}
return ans;
}
};
方法二:递归
对于一个子集来说,这个元素它要么不选,是一个子集,要么选,也是一个子集
代码语言:javascript复制class Solution {
public:
vector<vector<int> > ans;
vector<int> nums;
vector<int> array;
void dfs(int depth) {
if (depth == nums.size()) {
ans.push_back(array);
return;
}
array.push_back(nums[depth]);
dfs(depth 1);
array.pop_back();
dfs(depth 1);
}
vector<vector<int> > subsets(vector<int> &nums) {
this->nums = nums;
dfs(0);
return ans;
}
};