力扣-77-组合
直达链接
这个问题应该就是我想找的答案了,把k=1~n全部输出一遍
然后如果k=n,那就是全排列问题不对,还是不一样,这里只考虑数字组合,而没考虑数字顺序也就是排列问题
两种解法,第一种是枚举(选和不选两种情况),而且听说可以写for和不写两种写法(有待验证)
而方法二还是采用类似于子序列的生成01序列然后匹配的做法
2022-12-7重做
使用回溯的是全排列,这个不太一样,这个是组合
评论区提醒是:同样可以用回溯,只不过排列每次都是从头开始,需要记录已经访问过的元素,而组合不需要,组合只需要在本次选择后面的元素中进行下一次选择
由这个朴素的思路,写出的代码:
class Solution { public: vector<vector<int>> res; void backTrace(vector<int>& temp, int n, int k, int index) { if (temp.size() == k) { res.push_back(temp); return; } // 这里不要刻意控制右边界 for (int i = index; i <= n; i++) { temp.push_back(i); backTrace(temp, n, k, i + 1); temp.pop_back(); } } vector<vector<int>> combine(int n, int k) { vector<int> temp; backTrace(temp, n, k, 1); return res; } };
去比对了一下两个月前的的代码,有两点注意:
- 做了一个剪枝,这个剪枝的效果有多大?大概是
if (temp.size() + n - index + 1 < k) return;
就是我之前想要通过控制右边界却错了做法的想法 - temp能定义为类变量吗?可以
效果出乎意料的显著,是幻觉吗?!
class Solution { public: vector<vector<int>> res; vector<int>temp; void backTrace(int n, int k, int index) { if (temp.size() + n - index + 1 < k) return; if (temp.size() == k) { res.push_back(temp); return; } for (int i = index; i <= n; i++) { temp.push_back(i); backTrace(n, k, i + 1); temp.pop_back(); } } vector<vector<int>> combine(int n, int k) { backTrace(n, k, 1); return res; } };
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16744484.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步