找回密码
 立即注册
首页 业界区 科技 算法day19-回溯(1)

算法day19-回溯(1)

讲怔 2025-6-8 11:54:10
目录


  • 理论基础
  • 组合
  • 组合总和III
  • 电话号码的字母组合
一、理论基础

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

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里面有多少符合条件的子集
  • 排列问题:N个数按照一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等
  组合无序,排列有序!
  回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度就构成了树的深度。递归就要有终止条件,所以必然是一棵高度有限的树。
1.png

 
  回溯法模板:
  1. void backtracking(参数) {
  2.     if (终止条件) {
  3.         存放结果;
  4.         return;
  5.     }
  6.     for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
  7.         处理节点;
  8.         backtracking(路径,选择列表); // 递归
  9.         回溯,撤销处理结果
  10.     }
  11. }
复制代码
二、组合_【组合问题】

 https://leetcode.cn/problems/combinations/description/?envType=problem-list-v2&envId=8At1GmaZ
2.png

[code]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
您需要登录后才可以回帖 登录 | 立即注册