【代码随想录算法训练营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.hqwc.cn/news/484239.html

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

相关文章

win系统下安装php8.3版本并配置环境变量的详细教程

本篇文章主要讲解在win系统下安装和配置php8.3版本&#xff0c;并配置环境变量的详细教程。 日期&#xff1a;2024年2月22日 作者&#xff1a;任聪聪 一、下载php8.3版本包 php8.3版本官方下载地址&#xff1a;https://windows.php.net/download#php-8.3 步骤一、打开下载地址…

【鸿蒙 HarmonyOS 4.0】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…

OceanBase数据迁移-从MySQL导入数据到OceanBase

把MySQL中的数据导入到OceanBase&#xff0c;分几个步骤&#xff1a; 1.准备一份MySQL测试数据集2.使用mydumper工具导出MySQL数据3.使用myloader工具导入到OceanBase4.验证测试数据集在OceanBase下的执行情况 1.准备一份MySQL测试数据集 1.1.从github下载mysql测试数据集&a…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹正向飞行(带偏航角控制)并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹正向飞行&#xff08;带偏航角控制&#xff09;并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模…

模板(类模板)---C++

模板目录 2.类模板2.1 类模板语法2.2 类模板与函数模板区别2.3 类模板中成员函数创建时机2.4 类模板对象做函数参数2.5 类模板与继承2.6 类模板成员函数类外实现2.7 类模板分文件编写2.8 类模板与友元2.9 类模板案例 2.类模板 2.1 类模板语法 类模板作用&#xff1a; 建立一个…

[嵌入式AI从0开始到入土]15_orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

notepad++运行python闪一下就没啦

问题&#xff1a;Notepad直接快捷键运行Python代码,出现闪一下就没了 解决措施&#xff1a; ①点击菜单运行(Run) --> 运行(Run)弹出的对话框 ②把 cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT 粘贴进入这个对话框内 ③点击保存&a…

Rust Vs Go:从头构建一个web服务

Go 和 Rust 之间的许多比较都强调它们在语法和初始学习曲线上的差异。然而&#xff0c;最终的决定性因素是重要项目的易用性。 “Rust 与 Go”争论 Rust vs Go 是一个不断出现的话题&#xff0c;并且已经有很多关于它的文章。部分原因是开发人员正在寻找信息来帮助他们决定下…

EventStream获得数据流,前端配置获得推送的流

如上图所示&#xff0c;请求一个接口&#xff0c;接口以数据流的方式向客户端推送数据&#xff0c;默认需要消息收集一条&#xff0c;在原来的基础上追加&#xff0c;在create-react-app生成的工程中&#xff0c;如果代理使用了中间件http-proxy-middleware&#xff0c;同时dev…

强化学习(GPS)

GPS——Guided Policy Search引导策略搜索 基于模型的强化学习算法 GPS目前被作为基础算法广泛应用于各种强化学习任务中&#xff0c;其出发点在于纯粹的策略梯度方法在更新参数时不会用到环境模型因而属于一种无模型强化学习算法。由于没有利用任何环境的内在属性&#xff0…

stm32cubemx简单介绍

&#xff08;本文为简单介绍&#xff0c;内容源于网络&#xff09; STM32CubeMX是STMicroelectronics推出的一款用于STM32微控制器系列的图形化配置工具&#xff0c;旨在简化嵌入式软件开发过程。本文将对STM32CubeMX进行简要介绍&#xff0c;包括其功能特点、优势以及在嵌入式…

猫头虎分享已解决Bug || RuntimeError: size mismatch, m1: [32 x 100], m2: [500 x 10]

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …