Day27

回溯算法part01

回溯算法

  1. 回溯算法的本质:本质是穷举,穷举所有可能,然后选出我们想要的答案
    • 更高效的回溯算法:加入剪枝操作
  2. 回溯算法可以解决的问题类型
    • 组合问题:N个数里面按一定规则找出k个数的集合
    • 切割问题:一个字符串按一定规则有几种切割方式
    • 子集问题:一个N个数的集合里有多少符合条件的子集
    • 排列问题:N个数按一定规则全排列,有几种排列方式
    • 棋盘问题:N皇后,解数独等等
    • 组合是不强调元素顺序的,排列是强调元素顺序。
  3. 理解回溯算法
    • 回溯法解决的问题都可以抽象为树形结构
    • 给定已知集合的大小就构成了树的宽度,递归的深度就构成了树的深度。
  4. 回溯模板
    • 返回值以及参数:返回值一般为void,参数需要根据实际情况确定
    • 终止条件
    • 遍历过程:for(本层集合中的元素){处理;递归调用;回溯}
      • for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历
        在这里插入图片描述
        在这里插入图片描述

LC77组合

  1. 思路:使用回溯算法的思想和回溯算法的模板
  2. 终止条件,mid的size等于k
  3. for循环本层集合中的元素,即index到n
    在这里插入图片描述
  4. 采用剪枝操作在每一层的for循环上进行优化
    • 因为mid的size一定要满足k,当前for循环的情况下之后的结果数小于k的情况是一定不满足的可以直接舍弃
    • 当前for循环已经有了mid.size()个结果,仍需要k-mid.size()个结果,因此i最大只能是n-[k-mid.size()]+1
      在这里插入图片描述
      在这里插入图片描述
  5. 暴力:了解暴力更容易理解为什么for循环从i=index开始,并且递归为i+1不会遗漏其他情况(每个元素只使用一次)
    在这里插入图片描述
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值