当前位置: 首页 > news >正文

## Leetcode刷题Day24-------------------回溯算法

Leetcode刷题Day24-------------------回溯算法

1. 理论基础

  • 题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
  • 视频讲解:https://www.bilibili.com/video/BV1cy4y167mM

回溯算法涉及递归,是一种纯暴力搜索的算法
组合(12 和21是一种)、切割、子集、排序(12 和21是2种)、棋盘(N皇后)

回溯算法解题模版:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

2. 77. 组合

  • 题目链接:https://leetcode.cn/problems/combinations/
  • 文章讲解:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html
  • 视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv
  • 剪枝操作:https://www.bilibili.com/video/BV1wi4y157er

二维数组是最终的结果
一维数据是单次取到的结果

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    //官方函数
    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));//把得到的path收集到结果中
            return;
        }
        
        //for(int i=startIndex;i<=n;i++){
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { //优化的地方、剪枝操作
            path.add(i);//把第一个数加到path里
            backTracking(n,k,i+1);//取path里的第二个数,第三个数,第四个...
            path.removeLast();//删掉path里的最后一个数,回溯
        }
    }   
}

剪枝操作详解:
在这里插入图片描述
(该图来自B站算法随想录视频中的截图)
剪枝后的循环条件:for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { //优化的地方、剪枝操作




语句积累

	List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    path.removeLast();//删掉path里的最后一个数,回溯

相关文章:

  • 做行业网站投入/谷歌商店下载官方
  • 做网站PPPOE网络可以吗/软考十大最靠谱it培训机构
  • 基层政权和社区建设司网站/黄页88网络营销宝典
  • 如何注册个做电影的网站/青岛推广优化
  • 衢州建站/全网推广方案
  • 免费永久网站空间/福州seo
  • 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单
  • grpc、https、oauth2等认证专栏实战19:docker启动tls配置介绍
  • 2个大厂 100亿级 超大流量 红包 架构方案
  • 2023/1/15 JS-变量提升与函数提升 执行上下文
  • 基于transfomer架构的模型[GPT、BERT、VIT、ST、MAE等等]总结
  • 基于51单片机的pm2.5空气质量监测仪仿真设计
  • Java使用Zxing二维码生成
  • JavaSE与网络面试题
  • LeetCode080_80. 删除有序数组中的重复项 II
  • VueJs中的toRef与toRefs函数的一个比较
  • PHP正则匹配img并处理src
  • 绕过某博客查看文章验证码,关注公众号得验证码