代码随想录算法训练营第三十天|回溯算法总结、332.重新安排行程 、51. N皇后 、37. 解数独
回溯算法总结
回溯算法总结
文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.html
回溯算法就是递归的副产物,只要有了递归就会有回溯
回溯算法能解决的问题
- 组合问题:N个数里面按一定规则找出k个数的集合。
- 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
- 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 给定一个 没有重复 数字的序列,返回其所有可能的全排列。
- 示例:输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
- 切割问题:一个字符串按一定规则有几种切割方式
- 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。
- 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。
- 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
-
棋盘问题:N皇后,解数独等等
回溯整体不太好理解,需要把回溯法抽象为一个树形图形就好理解一些。
回溯算法的代码模版
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
别人画的回溯总结,挺不错的,后面可以再看看:
代码随想录中的总结
重新安排行程
332.重新安排行程
文章讲解:https://programmercarl.com/0332.%E9%87%8D%E6%96%B0%E5%AE%89%E6%8E%92%E8%A1%8C%E7%A8%8B.html
题目链接:https://leetcode.cn/problems/reconstruct-itinerary/
视频讲解:https://www.bilibili.com/video/BV1cy4y167mM/
自己看到题目的第一想法
困难题,先跳过。
看完代码随想录之后的想法
自己实现过程中遇到哪些困难
N皇后
51. N皇后
文章讲解:https://programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html
题目链接:https://leetcode.cn/problems/n-queens/
视频讲解:https://www.bilibili.com/video/BV1Rd4y1c7Bq/
自己看到题目的第一想法
困难题,先跳过。
看完代码随想录之后的想法
自己实现过程中遇到哪些困难
解数独
37. 解数独
文章讲解:https://programmercarl.com/0037.%E8%A7%A3%E6%95%B0%E7%8B%AC.html
题目链接:https://leetcode.cn/problems/sudoku-solver/
视频讲解:https://www.bilibili.com/video/BV1TW4y1471V//
自己看到题目的第一想法
困难题,先跳过。