回溯算法学习笔记

学习资料来源

代码随想录 - 关于回溯算法,你该了解这些!

什么是回溯法

回溯(backtracking)法又称回溯搜索法,它是一种搜索的方式。

回溯法不容易,但回溯法就是暴力解法。

回溯与递归形影不离。

backtracking

英 [ˈbæktrækɪŋ] 美 [ˈbæktrækɪŋ]

v. 原路返回;折回;折返;(屈于压力而)改变声明(或主张),出尔反尔;退缩

backtrack的现在分词

回溯法的效率

虽然回溯法难懂费解,但是它不是高效的算法。

因为回溯的本质是穷举,穷举所有可能,然后选出心仪的答案。如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。

既然回溯法并不高效为何还要用它呢?因为别无选择。一些问题除了暴力搜索,就没有其它更高效的解法。

回溯法解决的问题

回溯法,一般可以解决如下几种问题:

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

注意,组合与排序的区分。

组合是不强调元素顺序的,排列是强调元素顺序

例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{1, 2} 和 {2, 1} 就是两个集合了。

助记:组合无序,排列有序。

如何理解回溯法

回溯法解决的问题都可以抽象为树形结构。因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度也就构成的树的深度

递归就要有终止条件,所以必然是一颗高度有限的树。

回溯法模板

回溯三部曲:

  1. 函数签
  2. 止条件
  3. 过程

助记:一位中国人,给美国送,创造史。

回溯函数模板返回值以及参数(函数签名)

在回溯算法中,回溯函数一般情况下命名为backtracking,返回值一般为void,至于函数参数一开始不容易确定,所以一般先写逻辑,参数随后按需添加。

//回溯函数签名示例
void backtracking(参数 ...){}

回溯函数终止条件

什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。

if (终止条件) {存放结果;return;
}

回溯搜索的遍历过程

前文谈到,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

从图中看出,for循环理解成横向遍历,backtracking(递归)则是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果
}

总结

回溯算法模板框架如下:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

这份模板很重要,日后用到回溯法题目都靠它了

经典题目

  1. 求组合问题 - LeetCode - Medium - 77. Combinations
  2. 求组合总和 - LeetCode - Medium - 216. Combination Sum III
  3. 求N皇后问题 - LeetCode - Hard - 51. N-Queens
  4. 分割回文串 - LeetCode - Medium - 131. Palindrome Partitioning
  5. 求子集问题 - LeetCode - Medium - 78. Subsets
  6. 求子集问题 - LeetCode - Medium - 90. Subsets II
  7. 复原IP地址 - LeetCode - Medium - 93. Restore IP Addresses
  8. 求数独问题 - LeetCode - Hard - 37. Sudoku Solver
  9. 重新安排行程 - LeetCode - Medium - 332. Reconstruct Itinerary
  10. 排列问题 - LeetCode - Medium - 46. Permutations
  11. 排列问题 - LeetCode - Medium - 47. Permutations II
  12. 电话号码的字母组合 - LeetCode - Medium - 17. Letter Combinations of a Phone Number

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中int[]与Integer[]相互转化的方法

传统方法 //Convert int[] to Integer[] public static Integer[] toObject(int[] intArray) {Integer[] result new Integer[intArray.length];for (int i 0; i < intArray.length; i) {result[i] Integer.valueOf(intArray[i]);}return result; }//Convert Integer[] …

《UNIX环境高级编程 3rd》笔记(1 / 21):UNIX基础知识

文章目录引言UNIX体系结构登录登录名shell文件和目录文件系统文件名路径名工作目录起始目录输入和输出文件描述符标准输入、标准输出和标准错误不带缓冲的IO标准IO程序和进程程序进程和进程ID进程控制线程和线程ID出错处理出错恢复用户标识用户ID组ID附属组ID信号时间值系统调用…

《集体智慧编程》笔记(1 / 12):集体智慧导言

文章目录什么是集体智慧什么是机器学习机器学习的局限性真实生活中的例子学习型算法的其他用途小结Netflix, Google都适用了先进算法&#xff0c;将来自不同人群的数据加以组合&#xff0c;进而得出新的结论&#xff0c;并创造新的商机。 更多类似例子&#xff1a; 约会网站希…

《集体智慧编程》笔记(2 / 12):提供推荐

Making Recommendations 文章目录协作型过滤搜集偏好寻找相近的用户欧几里得距离评价皮尔逊相关度评价应该选用哪一种相似性度量方法为评分者打分推荐物品匹配相似商品构建一个基于某数据平台的链接推荐系统数据平台API构造数据集推荐近邻与链接基于物品的过滤构造物品比较数据…

LeetCode - Easy - 637. Average of Levels in Binary Tree

Topic Tree Description https://leetcode.com/problems/average-of-levels-in-binary-tree/ Given the root of a binary tree, return the average value of the nodes on each level in the form of an array. Answers within 10−510^{-5}10−5 of the actual answer w…

在CodeBlocks下配置GoogleTest单元测试框架

环境准备 Windows 10Code::Blocks 20.03Google Test 1.7.0CMake 3.11.0 编译GoogleTest 一、创建一个工作目录D:\gtest&#xff0c;将刚下载的Google Test 1.7.0、CMake 3.11.0的压缩包解压到刚创建的工作目录。 二、进入CMake文件夹的bin下&#xff0c;运行cmake-gui.exe&…

傻子都能看懂的马拉车Manacher

Manachers Algorithm 马拉车算法操作及原理 package advanced_001;public class Code_Manacher {public static char[] manacherString(String str) {char[] charArr str.toCharArray();char[] res new char[str.length() * 2 1];int index 0;for (int i 0; i ! res.len…

简单暴力到dp的优化(萌新篇)

想写一系列文章&#xff0c;总结一些题目&#xff0c;看看解决问题、优化方法的过程到底是什么样子的。 系列问题一&#xff1a;斐波那契数列问题 在数学上&#xff0c;斐波纳契数列以如下被以递归的方法定义&#xff1a;F(0)0&#xff0c;F(1)1, F(n)F(n-1)F(n-2)&#xff08…

LeetCode - Medium - 114. Flatten Binary Tree to Linked List

Topic TreeDepth-first Search Description https://leetcode.com/problems/flatten-binary-tree-to-linked-list/ Given the root of a binary tree, flatten the tree into a “linked list”: The “linked list” should use the same TreeNode class where the right…

简单暴力到dp的优化(入门篇)

上篇&#xff0c;我们提到&#xff0c;遇到问题&#xff0c;首先根据定义写出笨方法&#xff0c;找出依赖关系&#xff08;有些题这一步就不太简单&#xff0c;要自己归纳关系&#xff09;&#xff0c;然后进行优化&#xff0c;下面&#xff0c;我们通过几道此方面的经典的&…

简单暴力到dp的优化(初级篇)

一、一维非脑残 1 一个只包含A、B和C的字符串&#xff0c;如果存在某一段长度为3的连续子串中恰好A、B和C各有一个&#xff0c;那么这个字符串就是纯净的&#xff0c;否则这个字符串就是暗黑的。例如&#xff1a;BAACAACCBAAA 连续子串"CBA"中包含了A,B,C各一个&am…

ccpc河北大学生程序设计竞赛dp小总结

近期题目来自校赛&#xff0c;赛前训练&#xff0c;省赛热身&#xff0c;河北ccpc正式比赛。 题目一&#xff1a; 题目描述&#xff1a; 由于第m个台阶上有好吃的薯条&#xff0c;所以薯片现在要爬一段m阶的楼梯. 薯片每步最多能爬k个阶梯&#xff0c;但是每到了第i个台阶&a…

c语言简便实现链表增删改查

注&#xff1a;单追求代码简洁&#xff0c;所以写法可能有点不标准。 //第一次拿c开始写数据结构&#xff0c;因为自己写的&#xff0c;追求代码量少&#xff0c;和学院ppt不太一样。有错请指出 #include <stdio.h> #include <stdlib.h> #include <string.h>…

第一次课 课上代码

第一次课内容 学习心态及注意事项 信心 谦虚 脚踏实地 多动手 python简介 代码量少&#xff0c;简介&#xff0c;易上手&#xff0c;语法要求不过于严格&#xff0c; Python 库。 速度慢&#xff0c; 不可加密。 输出、变量、输入 数据类型&#xff1a;整数、浮点数…

计算机考研专业课只考一科的学校汇总

下列学校专业课只考1门 &#xff08;每项科目下的学校均按照最新学科评估结果由高到低进行排名&#xff09; C语言程序设计 1. 湖南大学 计算机技术&软工专硕&#xff08;信息科学与工程学院&#xff09; 2. 中国海洋大学 计算机技术&#xff08;01计算机应用技术方向&am…

数组实现栈

学习了改进&#xff0c;利用define typedef比上次写的链表更容易改变功能&#xff0c;方便维护&#xff0c;代码更健壮。 大佬别嫌弃&#xff0c;萌新总是很笨&#xff0c;用typedef都想不到。 #include<stdio.h> #include<stdbool.h> #define maxsize 10 typede…

简单暴力到dp的优化(中级篇)

下面再放三道我比较喜欢的&#xff0c;需要好好写一下的题。 第一题比较水 1. White Cloud is exercising in the playground. White Cloud can walk 1 meters or run k meters per second. Since White Cloud is tired,it cant run for two or more continuous seconds. Whi…

第二次课 课上代码

敲一遍&#xff0c;体会每行代码想表达的意思。 第二讲 创建.py文件 数据类型&#xff1a;布尔(and\or\not) 条件判断语句(if elif else) 列表基础操作&#xff08;特点、创建、增加元素、len()、下标、py切片&#xff09; >>> 5>4 True >>> 4>5 Fa…

第一次课 优秀作业展示

18级河北师大软件编程训练 很多同学非常认真的完成了作业&#xff0c;这里选出比较优秀的作业展示出来。 注&#xff1a;展示顺序不是排名 为了尊重同学们的劳动成果&#xff0c;并没有要代码&#xff0c;只是截图展示。 范天祚 &#xff08;傻兔子&#xff09; 熊静祎&…

dp打开思路:HDU1029 HDU1087 HDU1176 HDU1257 POJ1458(水题不水)

题目&#xff1a;https://vjudge.net/contest/68966#overview HDU - 1029 题意&#xff1a;找出出现次数超过一半的数字 蠢思路&#xff1a;排序找中间 DP&#xff1a;扫一遍一个变量count记录解出现的次数&#xff0c;是当前解就&#xff0c;否则--&#xff0c;count为负就…