力扣-78-子集
作者:互联网
看完感觉跟46-全排列很像,仍旧是回溯法,但是怎么做到四选二、四选三呢
官方题解
题解1,迭代枚举
利用二进制位来实现挑选的思路是没有想到的
class Solution {
public:
// 为什么变量声明这里要写到外面来
vector<int> t;// 临时数组
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ret;
for (int mask = 0; mask < (1 << n); ++mask) {
// 1左移n位相当于乘2的n次方
// 0到2的n次方减一
t.clear();
for (int i = 0; i < n; ++i) {
// 二进制序列的长度
// 从右至左判断mask每一位是不是1,如果是,就把参数数组中对应的数放进去
if (mask & (1 << i)) {
t.push_back(nums[i]);
}
}
ret.push_back(t);
}
return ret;
}
};
不过这关“迭代”什么事
题解2,递归回溯
class Solution {
public:
// 这个递归的深度优先算法应该就是标准的回溯了
vector<int> t;
vector < vector<int>> ans;
// 参数是:当前的位置、参数数组
// 进入DFS前[0,cur-1]位置的状态是确定的
// 一轮中要确定cur位置的状态
void dfs(int cur, vector<int>& nums) {
// 如果当前位置等于数组长度,一个数组的处理就完成了,插到结果数组里去
if (cur == nums.size()) {
ans.push_back(t);
return;
}
t.push_back(nums[cur]);
dfs(cur + 1, nums);// 这个相当于是1,这个位置被插进去了的递归
// 递归
t.pop_back();
// 又是这个熟悉的回退操作
// 这就是所谓的“回溯”了
dfs(cur + 1, nums);// 而这个相当于是0,这个位置没被插进去的递归
}
vector<vector<int>> subsets(vector<int>& nums) {
dfs(0, nums);
return ans;
}
};
评论里还有很多不同的解法,例如:动态规划
标签:cur,递归,nums,dfs,力扣,vector,子集,回溯,78 来源: https://www.cnblogs.com/yaocy/p/16415335.html