力扣-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; } };
评论里还有很多不同的解法,例如:动态规划
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16415335.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步