算法day19-回溯(1)
目录[*]理论基础
[*]组合
[*]组合总和III
[*]电话号码的字母组合
一、理论基础
回溯法,一般可以解决以下问题:
[*]组合问题:N个数里面按一定规则找出k个数的集合
[*]切割问题:一个字符按一定规则有几种切割方式
[*]子集问题:一个N个数的集合里面有多少符合条件的子集
[*]排列问题:N个数按照一定规则全排列,有几种排列方式
[*]棋盘问题:N皇后,解数独等
组合无序,排列有序!
回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度就构成了树的深度。递归就要有终止条件,所以必然是一棵高度有限的树。
回溯法模板:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}二、组合_【组合问题】
https://leetcode.cn/problems/combinations/description/?envType=problem-list-v2&envId=8At1GmaZ
class Solution { List res; List path; public List combine(int n, int k) { res = new ArrayList(); path = new ArrayList(); dfs(1,k,n); //入口 return res; } public void dfs(int i,int k, int n){ if(path.size() == k){ //终止条件:树的深度到k res.add(new ArrayList(path)); return; } for(int j=i; j n){ return; //剪枝 } for(int j=i; j
页:
[1]