三个例题说明白什么是回溯算法,javascript解决组合问题
创始人
2025-05-29 03:06:02
0次

最近忙疯了呜呜呜,读研不易,小李叹气…
今天好不容易忙的差不多了,刷了一会力扣,最近在刷回溯算法,刷着刷着还是觉得有点难,总结一波~

什么是回溯算法

回溯算法其实很复杂,本质上就是一种穷举的方式,穷举所有可能的结果,然后选出我们想要的答案。

怎么理解呢,其实我们一般在组合数中用回溯算法比较多,比如,从N个数里面按照一定的规则找出k个数的集合,这种问题我们就可以用到回溯算法。

具体怎么用呢?我们在解决组合问题的时候,往往会构造一棵树,然后一层层去遍历,回溯算法就是在集合中递归查找子集,集合的大小就是树的宽度,子集的大小就是数的深度;

看到这里可能还是有点懵┭┮﹏┭┮,下面通过案例来讲解:

案例1:力扣第77题.组合

题目是这样的:
在这里插入图片描述

其实这个题就是一个典型的组合问题,从n个数中抽取k个数,组成集合,只不过我们要列举出来所有的集合情况,“列举所有的情况”,遇到这种,一般肯定就是穷举,用for循环肯定也能解决,但是如果n和k的值一旦变得很大,for循环就很冗余和复杂,所以这里最好学会使用回溯。

根据上面介绍的,回溯法就是构建一棵树,宽度为n,深度为k,这里假设n为4,k为2,就可以画出树形结构如下所示:
在这里插入图片描述
其实这个图就很清晰明了啦,其实问题就转换成,树的遍历问题,把从root节点到最后的子节点的所有路径都写出来,现在关键是怎么写代码,先把正确的代码摆出来:

/*** @param {number} n* @param {number} k* @return {number[][]}*/
var combine = function(n, k) {var result=[];//这个定义了全局变量,用来保存最终结果的var path=[];//这个定义了全局变量,用来保存树的每一条路径var temp=[]//这里注意坑,这里我采用一个中间变量来承接path的内容,不然直接=赋值的就是数组的地址,可以敲代码验证一下//----------------这个函数就是定义的的递归函数————————————————var backtracking=function(n,k,index){if(path.length==k){//定义递归跳出的最终条件for(var i=0;itemp.push(path[i]);} result.push(temp)  temp=[]  return;}for(var i=index;i<=n;i++){//控制树的横向遍历path.push(i);//处理节点backtracking(n,k,i+1);//控制树的纵向遍历path.pop();//回溯,撤销处理的节点}}backtracking(n,k,1);return result;
};

具体的写在注释里面啦,建议多看几遍代码结构,后面好几个题都要这样写~

看懂上面这个题之后,下面通过几个题目练练手,也是用到了回溯算法,看看能否举一反三:

案例2:力扣216.组合总和III

在这里插入图片描述
画图是这样的(这里举k=2,n=4的例子):
在这里插入图片描述
其实这个题本质上和上一个题差不多,就是从9个数中选出k个数的集合,上一题中递归结束的条件是path数组的长度等于k,这里结束的条件稍微发生了变化,首先path数组的长度也要等于k,其次,这k个数的和应该等于n。想到这里,其实就很容易照着上面写出代码:

/*** @param {number} n* @param {number} k* @return {number[][]}*/
var combine = function(n, k) {var result=[];var path=[];var temp=[];//更改点1var sum=0;var backtracking=function(n,k,index){if(path.length==k){if(sum==n){//更改点2for(var i=0;itemp.push(path[i]);} result.push(temp)  temp=[] } return;}for(var i=index;i<=9;i++){//更改点3path.push(i);sum=sum+i;//更改点4backtracking(n,k,i+1);path.pop();sum=sum-i;//更改点5}}backtracking(n,k,1);return result;
};

这样问题就完美的解决了~下面我们继续加大点难度,这次我们尝试不要复制上面的代码,尝试自己去手敲:

案例3:力扣17.电话号码的字母组合

在这里插入图片描述
其实这个题还是和之前的问题一样,只是现在这个n不确定,n=digits.length*3,digits.length对应的就是输入的数字的个数,每个数字除了0和1,都代表三个字母。k等于digits.length。所以我们可以考虑用一个数组来保存每个数字对应的字母:

/*** @param {string} digits* @return {string[]}*/
var letterCombinations = function(digits) {const letterMap=["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];var result=[];var path=[];var temp=[];var backtracking=function(digits,index){if(path.length==digits.length){for(var i=0;itemp.push(path[i]);}result.push(temp.join(''));temp=[];return;}var digit=digits[index]-0;var letters=letterMap[digit];for( var j=0;jpath.push(letters[j]);backtracking(digits,index+1);path.pop();}}if(digits.length==0){return result;}backtracking(digits,0);return result;
};

这个题的区别在于,怎么把上一层和下一层区分开来,之前都是通过加1进行区分,现在是对字母进行遍历,还是有点难度的。

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...