【代码随想录算法训练营Day24】● 回溯法理论基础 ● 77. 组合

文章目录

  • Day 24 第七章 回溯算法part01
    • 理论基础
      • 什么是回溯
      • 使用原因 & 解决的问题
      • 如何理解回溯法
    • 77. 组合
      • 思路
      • 剪枝
      • 代码

Day 24 第七章 回溯算法part01

  • 今日内容:
    • ● 理论基础
    • ● 77. 组合

理论基础

  • 其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。
  • 视频讲解:https://www.bilibili.com/video/BV1cy4y167mM
  • 文章讲解: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

什么是回溯

程序在运行过程中分成了多个阶段
通过某些手段将数据恢复到之前的某一阶段,就称之为回溯
手段包括:1. 方法栈;2. 自定义栈

使用原因 & 解决的问题

回溯和递归是相辅相成的,只要有递归就会有回溯,回溯算法一般是在递归的下面
说到回溯函数其实就是递归函数
回溯法是一个纯暴力搜索,有些问题能纯暴力搜索出来就不错了

  • 需要用回溯法解决的问题
    • 组合问题:N个数里面按一定规则找出k个数的集合
    • 切割问题:一个字符串按一定规则有几种切割方式
    • 子集问题:一个N个数的集合里有多少符合条件的子集
    • 排列问题:N个数按一定规则全排列,有几种排列方式
    • 棋盘问题:N皇后,解数独等等

如何理解回溯法

所有回溯法都可以抽象成一个树形结构n叉树

树的宽度就是回溯法处理时集合的大小(利用for循环)
树的深度就是递归的深度(递归)
如图:

回溯算法理论基础

//回溯算法参数一般很难一开始就确定,需要啥就放啥
void backtracking(参数){if(终止条件){//收集结果return;}//单层搜索逻辑for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){//处理节点backtracking(路径, 选择列表);//递归函数//回溯操作,撤销处理结果}return;
}

for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

backtracking这里自己调用自己,实现递归。

大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

77. 组合

  • 对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。
  • 在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。
  • 本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。
  • 题目链接:https://leetcode.cn/problems/combinations/
  • 视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv
    • 剪枝操作:https://www.bilibili.com/video/BV1wi4y157er
  • 文章讲解:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html

思路

与排列的思路一样,只不过是要设定一个start参数表示起始处理数字
这样就不用重复组合

剪枝

当剩余数字个数小于需要组合的数字个数时,就不需要再遍历了

代码

public static List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<>();dfs(1, n, k, new LinkedList<>(), res);return res;
}
//start:起始处理数字
public static void dfs(int start, int n, int k, LinkedList<Integer> stack, List<List<Integer>> res){if(stack.size() == k){res.add(new ArrayList<>(stack));return;}for (int i = start; i <= n; i++) {//❗剪枝操作// k - stack.size():表示当前缺失的数字个数// n - i + 1:表示还剩几个备用数字if(n - i + 1 < k - stack.size()){continue;}stack.push(i);dfs(i + 1, n, k, stack, res);stack.pop();    //回溯}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言之break

break是用来结束循环的语句&#xff0c;当符合break语句时&#xff0c;跳出循环 比如说123n&#xff0c;当用户输入要达到数值时&#xff0c;程序自动结束。 #include<stdio.h> int main() {int i,total,x;puts("请输入要中止的数:");scanf("%d",&…

计算机服务器中了DevicData勒索病毒怎么办?DevicData勒索病毒解密数据恢复

网络技术的发展与更新为企业提供了极大便利&#xff0c;让越来越多的企业走向了正规化、数字化&#xff0c;因此&#xff0c;企业的数据安全也成为了大家关心的主要话题&#xff0c;但网络是一把双刃剑&#xff0c;即便企业做好了安全防护&#xff0c;依旧会给企业的数据安全带…

python(23)——while循环

前言 在Python中&#xff0c;while 循环用于重复执行一段代码块&#xff0c;只要指定的条件保持为真&#xff08;True&#xff09;。一旦条件变为假&#xff08;False&#xff09;&#xff0c;循环就会终止。while 循环通常用于在不知道循环将执行多少次的情况下进行迭代。 w…

2024.02.22作业

1. 将互斥机制的代码实现重新敲一遍 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <…

世界顶级名校计算机专业学习使用教材汇总

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IauYk2cGjEyljid0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析

详情V&#xff1a;gjt0312765817632教授如何集成多源数据&#xff0c;依托ArcGIS Pro和R语言环境&#xff0c;采用“活力-组织力-恢复力-贡献力”&#xff08;VORS&#xff09;模型定量测算生态系统健康指数&#xff08;EHI&#xff09;&#xff1b;如何从经济城镇化&#xff0…

瑞_Redis_初识Redis(含安装教程)

文章目录 1 初识Redis1.1 认识NoSQL1.1.1 结构化与非结构化1.1.2 关联和非关联1.1.3 查询方式1.1.4 事务1.1.5 总结 1.2 认识Redis1.2.1 介绍1.2.2 特征1.2.3 优势 1.3 安装Redis ★★★1.3.1 Linux安装Redis1.3.1.1 安装Redis依赖 1.3.2 Windows安装Redis1.3.2.1 安装步骤1.3.…

springboot实现Aop(通知)切面编程的案例

以下是一个使用Spring Boot AOP的简单案例&#xff1a; 假设我们有一个UserService接口&#xff0c;它包含了两个方法&#xff1a;getUserById和createUser。我们希望在每个方法执行前后打印日志。 首先&#xff0c;我们需要创建一个切面类&#xff0c;用于定义我们的切面逻辑…

在Vue中使用TypeScript时 props指定枚举类型

推荐一款AI网站 AI写作与AI绘画智能创作平台 - 海鲸AI | 智能AI助手&#xff0c;可以免费领取GPT3.5无限卡 在Vue中使用TypeScript时&#xff0c;您可以通过定义一个枚举类型&#xff0c;然后在组件的props定义中使用这个枚举来指定props的类型。以下是一个如何做到这一点的例子…

Angular构建Library报错:error NG3001: Unsupported private class

报错 Unsupported private class ObjTypeSelectorComponent. This class is visible to consumers via SimpleFormsModule -> ObjTypeSelectorComponent, but is not exported from the top-level library entrypoint. 解决方案 未在index.ts / projects.ts中导出&#xf…

ETL快速拉取物流信息

我国作为世界第一的物流大国&#xff0c;但是在目前的物流信息系统还存在着几大的痛点。主要包括以下几个方面&#xff1a; 数据孤岛&#xff1a;有些物流企业各个部门之间的数据标准不一致&#xff0c;难以实现数据共享和协同&#xff0c;容易导致信息孤岛。 操作繁琐&#x…

数据结构D3作业

1. 2. 按位插入 void insert_pos(seq_p L,datatype num,int pos) { if(LNULL) { printf("入参为空&#xff0c;请检查\n"); return; } if(seq_full(L)1) { printf("表已满&#xff0c;不能插入\n"); …

unity学习(34)——角色选取界面(跨场景坑多)

先把SelectMenu中的camera的audio listener去掉。 现在还是平面&#xff0c;直接在camera下面添加两个panel即可&#xff0c;应该是用不到canvas了&#xff0c;都是2D的UI。 加完以后问题来了&#xff0c;角色选择界面的按钮跑到主界面上边了&#xff0c;而且现在账号密码都输…

CoordConv(NeurIPS 2018)

paper&#xff1a;An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution official implementation&#xff1a;https://github.com/uber-research/coordconv 存在的问题 本文揭示并分析了CNN在两种不同类型空间表示之间转换能力的欠缺&#…

远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”

原因&#xff1a; vscode 版本是 1.86&#xff0c;服务器上的 glibc 和 libstdc 版本不满足 要求(2.28 和 3.4.25)。 解决&#xff1a; 1、下载 1.85.2&#xff0c;解压直接运行 Code.exe。 2、回退 Remote-ssh 到 0.107.1。 参考&#xff1a; vscode 1.86版本远程ssh不兼容旧…

Leetcode155(设计最小栈)

例题&#xff1a; 分析&#xff1a; 题目要求我们必须在常数时间内检索到最小元素。 我们可以使用两个栈&#xff08;A、B&#xff09;来实现&#xff0c;A栈用来正常存储数据、弹出数据&#xff0c; B栈用于存储A栈中的最小元素&#xff0c;如下图&#xff1a; 刚开始&#…

【webpack】基础介绍

当我们深入分析Webpack时&#xff0c;可以更加详细地了解它的工作原理、构建流程、常用配置和插件。 工作原理&#xff1a; 解析模块&#xff1a; Webpack从入口文件开始&#xff0c;递归地解析模块之间的依赖关系&#xff0c;构建一个依赖图。解析过程中&#xff0c;Webpack会…

windows 10 和 11 的3个杀招软件

大家喜欢的3个windows 小工具 千万别开着杀毒软件解压 建议关闭后解压 小弟弟保证不是病毒 下载地址 : https://download.csdn.net/download/nn_84/88865566

ES6 面试题

1. const、let 和 var 的区别是什么&#xff1f; 答案&#xff1a; var 声明的变量是函数作用域或全局作用域&#xff0c;而 const 和 let 声明的变量是块级作用域。使用 var 声明的变量可以被重复声明&#xff0c;而 const 和 let 不允许重复声明同一变量。const 声明的变量…

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有&#xff1a;1&#xff09;xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定&#xff1b;2&#xff09;Web请求参数绑定&#xff0c;在Spring MVC 中&#xff0c;Controller的方法参数通常会自…