回溯算法
DarkFlameMaster2188
这个作者很懒,什么都没留下…
展开
-
37. 解数独
本体和N皇后这道题有不少相像之处,比如都需要判断当前位置是否该填入数值,有着约束条件,但两者也有不同之处,本题需要两层遍历,也就是对行和列都进行遍历,来找出唯一解。一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。只需要棋盘(二维数组)board即可,但函数需要返回值,当找到唯一解时返回。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。原创 2024-06-20 17:02:19 · 109 阅读 · 0 评论 -
51. N 皇后
每一层都从第1列开始遍历,当本层本列的位置可以放置皇后时,修改chessboard中对应位置的值,向下一层递归,并进行回溯。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。(3)检查135度角:从当前位置的上一行下一列开始,每次循环减一行加一列,检查是否有Q。(2)检查45度角:从当前位置的上一行上一列开始,每次循环递减一行一列,检查是否有Q。(1)检查同列:检查之前每一层的这一列是否有Q。(1)不能同行(2)不能同列(3)不能同斜线。原创 2024-06-20 15:13:33 · 234 阅读 · 0 评论 -
332. 重新安排行程
本题的核心解题思想在于使用映射关系,一个机场要对应多个机场,因此可以使用unorder_map,同时对应的机场要有顺序,则可以使用mutiset,map,mutimap。unordered_map<string, map<string, int>> targets:unordered_map<出发机场, map<到达机场, 航班次数>> targets。请你对该行程进行重新规划排序。,因为后面有对 target.second 做减减操作,如果没有引用,单纯复制,这个结果就没记录下来,那最后的结果就不对了。原创 2024-06-20 14:15:05 · 371 阅读 · 0 评论 -
46. 全排列
本题由于是排列而不是组合,因此每层循环都从i为0开始;其次本题要注意记录使用过的元素,因此可以使用一个数组来记录每层遍历中使用过的元素;最后注意本题的终止条件,当结果大小等于元素数组的大小时,返回;原创 2024-06-19 17:24:17 · 192 阅读 · 0 评论 -
491. 非递减子序列
本题仍旧是同层去重,可以使用unordered_set容器记录本层中该元素是否使用过。由于新的一层会重新建立set容器,因此回溯时不需对set容器进行另外的操作。本题要注意题目陷阱,求自增子序列,是不能对原数组进行排序的,因此不能用之前的去重逻辑(我第一次就错在这儿了)。原创 2024-06-19 10:55:31 · 262 阅读 · 0 评论 -
93. 复原 IP 地址
我是采用与其相同的做法,将正确的子字符串放入一个string数组中,待符合构成IP地址的条件时,将nums数组组成一个string变量str,再将str存放在最终结果数组中;因为需要额外的string一维数组以及更多的for循环,所以占用空间较大。本题和分割回文串很像,区别在于判断子字符串是否有效,以及对字符串的分割方法。原创 2024-06-19 00:50:19 · 203 阅读 · 0 评论 -
131. 分割回文串
递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。我头次做题想出来了将字符串作为组合形式切割,也晓得判断回文,但具体写代码切割字符串时遇到了问题,本题有两个关键点:(1)怎么切割字符串(2)如何判断子字符串是否回文。原创 2024-06-19 00:49:29 · 188 阅读 · 0 评论 -
39.组合总和
本题要注意无重复元素数组中的元素是可以无限制重复选取的,因此没有组合数量的要求,但要注意组合中重复元素个数不同才为不同的组合,且组合中元素没有顺序。目标值,无重复元素数组,当前组合数组(用来计算数组总和,使用int变量会更简单,但我没考虑到),当前遍历起始点cur。本题我错误在没有考虑组合中元素相同,但顺序不同的情况,导致最终结果中出现重复组合。因为没有限制重复元素,所以每层选取都是从cur开始,遍历整个数组。组合值大于目标值时,返回;组合值等于目标值时,存放结果,返回。原创 2024-06-19 00:48:53 · 156 阅读 · 0 评论 -
电话号码的字母组合
首先确定当前遍历的数字,并找到对应的字母集,然后用for循环来取字母,注意回溯的cur是当前遍历第几个数字,而不是第几个字母(第一次就错在这儿了)首先定义两个全局变量,用来存放结果的string数组res,以及用来存放单个结果的string变量s。首先肯定有题目给出的string digits,然后还要有一个参数就是int型的cur,用来记录。当cur的大小和digits的大小相等时,将当前结果存入最终结果数组,返回。(1)回溯函数的参数。原创 2024-06-19 00:48:27 · 177 阅读 · 0 评论 -
组合(回溯算法)
参数含有两个int型参数n和k,其次需要记录每次递归从何处开始(因为组合中不含有同一个数),所以还需要一个int变量cur,不需要返回值。for循环每次从cur开始遍历,将当前值存放到nums中,然后调用递归函数向深处遍历,达到终止条件时返回。首先需要两个数组,res为二维数组,用来存放最终结果,nums为一维数组,用来存放当前组合。当组合的大小等于k时,将组合放入最终结果数组中,返回。(1)递归函数的参数和返回值。(3)单层搜索的过程。原创 2024-06-17 17:18:09 · 172 阅读 · 0 评论