回溯专题

1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度。

2.回溯算法三部曲

  • 确定参数和返回值
  • 回溯函数终止条件
  • 单层循环

3.回溯法思路
回溯法是一种算法思想,而递归是一种编程方法,回溯法可以用递归来实现

回溯法的整体思路是:搜索每一条路,每次回溯是对具体的一条路径而言的。对当前搜索路径下的的未探索区域进行搜索,则可能有两种情况:

  • 当前未搜索区域满足结束条件,则保存当前路径并退出当前搜索;
  • 当前未搜索区域需要继续搜索,则遍历当前所有可能的选择:如果该选择符合要求,则把当前选择加入当前的搜索路径中,并继续搜索新的未探索区域。

4.回溯算法模版(python版)

在递归调用之前「做选择」,在递归调用之后「撤销选择」

def backtrack(params){if 终止条件:存放结果;return;}for 遍历:本层n叉树的元素:处理节点;(需要剪枝)backtrack(params,选择列表);撤销操作;}
}

回溯法搜所有可行解的模板一般是这样的:

res = []
path = []def backtrack(未探索区域, res, path):if 未探索区域满足结束条件:res.add(path) # 深度拷贝returnfor 选择 in 未探索区域当前可能的选择:if 当前选择符合要求:path.add(当前选择)backtrack(新的未探索区域, res, path)path.pop()

重点概括:

  • 如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法;
  • 回溯算法是在一棵树上的 深度优先遍历(因为要找所有的解,所以需要遍历),按选优条件向前搜索,以达到目标,但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。回溯算法首先需要画出递归树,不同的树决定了不同的代码实现。

4.回溯算法解决的问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 棋盘问题:N皇后,解数独等等

组合问题

  • 77. 组合
  • 39. 组合总和
  • 40. 组合总和II
  • 216. 组合总和III
  • 17. 电话号码的字母组合

77. 组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。

题解

组合问题,相对于排列问题而言,不计较一个组合内元素的顺序性(即 [1, 2, 3] 与 [1, 3, 2] 认为是同一个组合),因此很多时候需要按某种顺序展开搜索,这样才能做到不重不漏。

把组合问题抽象为如下树形结构:
可以看出这个棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不在重复取。

根据三部曲:
(1)递归函数的参数和返回值
函数里一定有两个参数,既然是集合n里面取k的数,那么n和k是两个int型的参数。然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,…,n] )。

(2)终止条件
path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在树中path存的就是根节点到叶子节点的路径。

(3)单层搜索的过程
回溯法的搜索过程就是一个树型结构的遍历过程,可以for循环用来横向遍历,递归的过程是纵向遍历。
for循环每次从startIndex开始遍历,然后用path保存取到的节点。

剪枝优化:
举一个

【Leetcode】刷题之路3(python版)相关推荐

  1. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

  2. python -- leetcode 刷题之路

    第一题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], tar ...

  3. LeetCode刷题之路(四)——medium的进阶

    Problem 29:Divide Two Integers   不使用除法.乘法和求余运算,完成两个数的除法,当数值溢出时,返回MAX_INT.   解题思路:第一想法,直接用被除数循环减去除数,每 ...

  4. leetcode 刷题之路 64 Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  5. #leetcode刷题之路35-搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...

  6. #leetcode刷题之路39-组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  7. LeetCode刷题之路:1049. 最后一块石头的重量 II

    有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x < ...

  8. LeetCode刷题之路:11. 盛最多水的容器

    给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) .找出其中的两条线,使 ...

  9. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

  10. 【Leetcode】刷题之路2(python)

    哈希映射类题目(简单题小试牛刀啦bhn) 242.有效的字母异位词 349.两个数组的交集 1002.查找常用字符 202.快乐数 383.赎金信 242. 有效的字母异位词 用python的Coun ...

最新文章

  1. android点滴 之 进度条
  2. 机试记不住头文件_计算机考研机试攻略
  3. Spring Boot 中的容器配置
  4. Vitamio FAQ(2012-11-20 )
  5. jdk 9和jdk8_JDK 9已完成功能!
  6. 使用Eclipse切换TFS工作区
  7. “Max“ stands for big
  8. docker删除私有仓库中的镜像
  9. hadoop生态搭建(3节点)-07.hive配置
  10. Python远程连接Windows,并调用Windows命令(类似于paramiko)
  11. 用安卓设备通过otg完成电脑启动盘装机盘的制作,通过手机在U盘写入iso镜像
  12. 三点法求解并联机构动系相对静系的旋转矩阵
  13. IE浏览器网址被劫持
  14. 群晖NAS的公网、NAT、DDNS、证书等配置二
  15. MA均线指标详解、价托、量托
  16. 人生的换档时刻?你是怎么度过的
  17. linu安装python走到300就不动了_linux centos 安装python3.7报错会在load avg: 0.63 [307/416] test_socket卡住 解决办法...
  18. oracle中segment_name,Oracle segment_name为数字的怪象
  19. 电脑风扇转一下就停开不了机原因及解决方法
  20. 微博评论爬虫 | 情感分析 | 词云图展示

热门文章

  1. 2022-2028年中国小球产业深度调研及投资前景预测报告(全卷)
  2. 中信银行总行信息科技部笔试面试以及最后拿offer经历
  3. 确定修改——取消修改
  4. 你了解计算机系统的层次结构吗?计算机语言怎么发展的?
  5. 自定义Kubernetes调度程序来编排高可用性应用程序
  6. 2021年大数据常用语言Scala(三十二):scala高级用法 样例类
  7. Python的re模块 --- 正则表达式操作
  8. ValueError: urls must start with a leading slash
  9. Java/Android 调用类里面的方法
  10. android DrawerLayout 改变系统默认的灰色