[算法题解详细]回溯法解力扣77组合

  1. 1 <= k <= n

思路


看到这个题目第一时间我们可能会想到暴力循环来做,但是我们会发现这样是不行的,因为k是变量,所以循环的层数我们是不确定的,这个时候我们就可以用dfs+回溯来做,在dfs的每一层递归中套一层循环,并且每一层递归我们都可以调整搜索的剩余区间,从而搜索到符合要求的k个数的组合,下面我们看代码

代码


为了不让函数参数过多影响阅读,我们将要返回的答案集合和在递归中符合条件返回的集合都定义为全局变量

class Solution{

vector<vector> ans;

vector temp;//在dfs中满足出口条件添加到ans集合中

};

主函数中我们还要传入n,k两个参数以及一个非常关键的参数,这个参数就表示着dfs的每一层递归中循环的起始搜索位置,因为题目是要求从1-n中找出k个数,所以我们在主函数中首先传入1

class Solution {

public:

vector<vector> ans;

vector temp;

vector<vector> combine(int n, int k) {

dfs(n, k, 1);

return ans;

}

};

接下来是关键的dfs函数,首先出口条件是temp集合的长度等于k,这时表示已经搜索到了一个组合有k个数,因此我们要把这个组合添加到ans集合中,然后终止这一层递归,也是回溯到上一层递归去,来进行另一种组合的搜索

void dfs(int n, int k, int depth) {

if(temp.size() == k) {

ans.push_back(temp);

return;

}

}

这里注意我们是用了vector的push_back()方法将当前temp集合添加到了ans集合的末尾,因为题目中是说了不用管答案中的顺序的,因此我们不用管添加顺序。

前面说了我们是在dfs的每一层递归中去套一层循环,以此形成k层循环的查找,接下来就是一层for循环,循环变量的初值是startPos,我们之前提到了,除了n,k之外还有一个十分关键的参数,这个参数控制了每层循环搜索的区间

void dfs(int n, int k, int depth) {

if(temp.size() == k) {

ans.push_back(temp);

return;

}

for(int i = startPos; i <= n; i++) {

temp.push_back(i);

dfs(n, k, i + 1);

temp.pop_back();

}

}

现在我们来假设一下,

第一层递归选中了1这个数字,那么在接下来这层递归中1就不能再出现在搜素区间里了,就应该从2开始,同理2,3,4…也是一样,所以这个参数不是代表递归深度,而是代表每一层递归的搜索区间的起始搜索位置

在循环中temp.push_back(i)代表选中i这个数字,然后进入下一层递归,但是这里要注意,如果进入下一层递归后当前我们选中的数字不符合要求,我们就需要退回上一步的状态,也就是选中这个数字之前的状态,所以就需要temp.pop_back()去掉我们添加的数字,返回之前的状态,这就是回溯法,“在进入下一层递归前做的事,我们需要在递归后返回到做这个事之前的状态”。下面是完整代码

完整代码:

class Solution {

public:

vector<vector> ans;

vector temp;

void dfs(int n, int k, int depth) {

if(temp.size() == k) {

ans.push_back(temp);

return;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可免费下载

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

,可以扫码获取!!(备注:前端)**

[外链图片转存中…(img-OlNGO4rF-1713608637875)]

最后

分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可免费下载

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值