代码随想录 day24

回溯法理论基础

什么是回溯法: 回溯法和递归都是相辅相成的,回溯法一般隐藏在递归的下面。
回溯解决哪些问题: 回溯法是一个纯暴力的搜索法,可以解决组合问题、切割问题、子集问题、排列问题、棋盘问题(N皇后、解数独)。回溯法是特别抽象的,可以把回溯法理解成一个图形结构(树状图),一般来说这棵树的宽度就是我们要处理集合的大小,纵轴方向就是递归来处理的。
回溯模板:

let backtrenking = function(){
	if(终止条件){
		// 收集结果
		return;
	}
	for(...){ // 这里遍历的是集合的元素集
		// 处理节点
		// 递归
		// 回溯
	} 
}

题一:组合

题目链接: 组合
解题思路: 将组合问题抽象成一个树状的结构,设定一个path,用来记录单个结果,设定一个result,用来存放结果集,定好回溯三部曲,利用回溯模板,主要思路就是,当path的length等于给定的k的大小时就把path放入result,并return到上一步,return之后就是回溯了,过程有点复杂,三言两语说不清楚,还是对着代码好理解些。
解题代码:

var combine = function(n, k) {
    let path = [];
    var result = [];
    var backtrenking = function(n,k,stackIndex){
        if(path.length === k){
            let temp = JSON.parse(JSON.stringify(path));
            result.push(temp);
            return;
        }
        for(let i = stackIndex; i <=n;i++){
            path.push(i);
            backtrenking(n,k,i+1);
            path.pop(i);
        }
    }
    backtrenking(n,k,1);
    return result;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值