力扣视频笔记20——回溯法

定义

在这里插入图片描述
回溯——回到过去,去寻找不同的选择
——找到所有的可能

用一个比较通俗的说法来解释递归回溯
我们在路上走着,前面是一个多岔路口,因为我们并不知道应该走哪条路,所以我们需要尝试。尝试的过程就是一个函数。
我们选择了一个方向,后来发现又有一个多岔路口,这时候又需要进行一次选择。所以我们需要在上一次尝试结果的基础上,再做一次尝试,即在函数内部再调用一次函数,这就是递归的过程。
这样重复了若干次之后,发现这次选择的这条路走不通,这时候我们知道我们上一个路口选错了,所以我们要回到上一个路口重新选择其他路,这就是回溯的思想。

何时使用回溯算法

当问题需要 “回头”,以此来查找出所有的解的时候,使用回溯算法。

即满足结束条件或者发现不是正确路径的时候(走不通),要撤销选择,回退到上一个状态,继续尝试,直到找出所有解为止

怎么样写回溯算法

(从上而下,※代表难点,根据题目而变化)
①画出递归树,找到状态变量(回溯函数的参数),这一步非常重要※
②根据题意,确立结束条件
③找准选择列表(与函数参数相关),与第一步紧密关联※
④判断是否需要剪枝
⑤作出选择,递归调用,进入下一层
⑥撤销选择

例子—力扣78

方法一(扩展法)
在这里插入图片描述
首先为[],空列表是任何列表的子集
然后遍历1,把1添加到前面的空列表【1】。
然后遍历2,把2添加到前面的【】,【1】——【2】,【1,2】
然后遍历3,把3添加到前面的【】,【1】,【2】,【1,2】——【3】,【1,3】,【2,3】,【1,2,3】
在这里插入图片描述
方法二(回溯法)

其实回溯算法关键在于:不合适就退回上一步
然后通过约束条件, 减少时间复杂度.

(剪枝)一旦满足条件以后,就不用往下进行了,不用递归了。然后再去找别的可能性。

可以看到,不同的子集长度不同,第一行子集长度为0,第二行为1,第三行为2,第四行为3
递归的终止条件为 子集的长度。
一旦子集的长度为0,则终止,找到了
一旦子集的长度为1,则终止。返回上一层,找其他的可能。。。。。

所以它的子集长度在0-3之间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
伪代码:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值