理论基础
文章链接:代码随想录
视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili关于回溯算法,我公众号里已经讲完了,并且将回溯算法专题整理成一本PDF,该PDF共5万字,包含了30多张树形结构图、15道力扣精选回溯题目,21篇回溯法精讲文章,由浅入深,绝对是全网最精良的回溯算法资料!关注公众号「代码随想录」后台回复:回溯算法,就可以获取了,赶快下载看一看吧, 视频播放量 341439、弹幕量 2389、点赞数 9438、投硬币枚数 7672、收藏人数 5824、转发人数 904, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:【neko算法课】N皇后问题 回溯法【13期】,每天刷力扣(LeetCode),有用吗?,回溯算法套路②组合型回溯+剪枝【基础算法精讲 15】,【labuladong】回溯算法核心套路详解,十分钟快速入门贪心算法,算法20天速通!leetcodeHot100-- 回溯,启动!,【算法动画】回溯法与数独,5分钟理解回溯算法,带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!,回溯法求解哈密顿回路(图形解释)https://www.bilibili.com/video/BV1cy4y167mM/
总结:
1.回溯法解决的问题都可以抽象为树形结构。集合的大小就构成了树的宽度,递归的深度就构成树的深度
2.主要用来解决的问题:组合问题、切割问题、子集问题、排列问题、棋盘问题等。
77. 组合
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili关于回溯算法,我公众号里已经讲完了,并且将回溯算法专题整理成一本PDF,该PDF共5万字,包含了30多张树形结构图、15道力扣精选回溯题目,21篇回溯法精讲文章,由浅入深,绝对是全网最精良的回溯算法资料!关注公众号「代码随想录」后台回复:回溯算法,就可以获取了,赶快下载看一看吧, 视频播放量 213973、弹幕量 1358、点赞数 4989、投硬币枚数 4223、收藏人数 1901、转发人数 341, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:回溯算法框架,8.1 回溯算法之基本方法,【python】递归与回溯-基本理解(第一讲),8.4 回溯法之最大团问题,【labuladong】回溯算法秒杀所有排列/组合/子集问题,算法20天速通!leetcodeHot100-- 回溯,启动!,【labuladong】回溯算法核心套路详解,13.9 回溯法例5-01背包问题,13.5 回溯法例1-图的着色问题,回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】https://www.bilibili.com/video/BV1ti4y1L7cv
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
public void backtracking(int n, int k, int startIndex) {
if (path.size() == k) {
result.add(new ArrayList<>(path));
return;
}
for (int i = startIndex; i <= n - k + path.size() + 1; i++) {
path.add(i);
backtracking(n, k, i + 1);
path.remove(path.size() - 1);
}
}
}
216.组合总和III
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com, 这里刷题顺序,详细题解,应有尽有!, 视频播放量 66568、弹幕量 763、点赞数 1295、投硬币枚数 907、收藏人数 278、转发人数 72, 视频作者 代码随想录, 作者简介 哈工大师兄,在腾讯、百度搬过砖,代码随想录网站:programmercarl.com,相关视频:回溯算法套路②组合型回溯+剪枝【基础算法精讲 15】,带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!,还得用回溯算法!| LeetCode:17.电话号码的字母组合,贪心算法理论基础!,递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径,带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!,组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列,带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!,回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独,回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址https://www.bilibili.com/video/BV1wg411873x
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(n, k, 1, 0);
return result;
}
public void backtracking(int n, int k, int startIndex, int sum) {
if (path.size() == k) {
if (sum == n)
result.add(new ArrayList<>(path));
return;
}
for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
if (sum + i > n) {
break;
}
path.add(i);
backtracking(n, k, i + 1, sum + i);
path.remove(path.size() - 1);
}
}
}
17.电话号码的字母组合
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:
class Solution {
List<String> result = new ArrayList<>();
StringBuilder path = new StringBuilder();
final String[] leeterMap = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
if (digits.length() == 0) {
return new ArrayList<>();
}
backtracking(digits, 0);
return result;
}
public void backtracking(String digits, int index) {
if (index == digits.length()) {
String s = new String(path);
result.add(s);
return;
}
int num = digits.charAt(index) - '0';
for (int i = 0; i < leeterMap[num].length(); i++) {
path.append(leeterMap[num].charAt(i));
backtracking(digits, index + 1);
path.deleteCharAt(path.length() - 1);
}
}
}