代码随想录刷题笔记 DAY 24 | 回溯算法理论基础 | 组合问题 No. 77

文章目录

    • Day 24
      • 01. 回溯算法理论基础
        • 1.1 什么是回溯法?
        • 1.2 为什么要使用回溯法?
        • 1.3 如何理解回溯法?
      • 02. 组合问题(No. 77)
        • 2.1 题目
        • 2.2 笔记
        • 2.3 代码

Day 24

01. 回溯算法理论基础

1.1 什么是回溯法?

👉 递归函数的下面就是回溯的逻辑(有递归就有回溯)

  • 递归函数的后面位置其实就是平时提到的 后序位置
  • 也就是当前这个节点做完所有的操作返回上一个节点的时候,这时候对这个节点可以通过某些逻辑做回溯的操作
1.2 为什么要使用回溯法?

👉 💡 回溯法是一个纯暴力的搜索方法,并不是一个性能很优的算法

  • 当一个题目无法用正常的解法(多层 for 循环嵌套)来求出的时候就需要用到回溯法
  • 比如说求 组合问题、切割问题、子集问题、排列问题、棋盘问题
1.3 如何理解回溯法?

👉 将回溯法抽象为一个树形结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 递归可以形成一个树形结构,如果一层中只有一个递归就只会形成一个链表结构而不是树形结构,所以一层中是存在多个递归调用的。

  • 所以可以总结出回溯法的一个模板

    public void backtracking() {if (...) {return;}for (int i = ...; i < ...; i++) {// 分枝来形成树形结构达到搜索的目的// 回溯算法}
    }
    

02. 组合问题(No. 77)

题目链接

代码随想录题解

2.1 题目

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n
2.2 笔记

先来思考这道题为什么需要用回溯算法来解决。

如果要通过 for 循环来解这道题的话会遇到什么困难呢?

如果说固定 k 仅仅限制 n 的话,代码很容易写的出来比如说 k 是 2

List<Integer> path = new ArrayList<>(); // 存储路径值的链表
List<List<Integer>> res = new ArrayList<>(); // 存储结果的链表
for (int i = 1; i <= n; i++) {path.add(i);for (int j = i + 1, i <= n; i++) {path.add(j);res.add(new ArrayList(path));path.remove(path.size() - 1);}path.remove(path.size() - 1);
}

但是如果说 k = 50 或者 k = 100 呢?写一百层 for 循环就会出现很多问题了。

其次不只是书写的问题,通过 for 循环来解题是无法控制 for 循环的层数的

而使用回溯算法可以很容易的解决这个问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回溯法可以通过递归来控制 for 循环的层数来达到和多层嵌套相同的效果。

这道题的解题思路就是通过一个 List 来收集路径上的节点,当节点的数量等于 k 的时候就收集起来,并且删除掉这个节点来进行后序的遍历。

套用回溯法的模板来解决问题:

public void backtracking() {if (...) {return;}for (int i = ...; i < ...; i++) {// 分枝来形成树形结构达到搜索的目的// 回溯算法}
}

递归结束的条件也就是收集结果的时候,在这道题目中是收集到的节点数目等于 n 的时候,就是 path.size() == n

然后就是分枝的处理了,先将 1 ~ 4 分成四份然后再从 i 到 n 分成 n - i + 1 份,所以需要一个指针来标识要分成几份 startIndex

最后就是回溯的代码,和上面说的相同,删除掉这个节点来进行后序的遍历。

2.3 代码
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n, k, 1);return res;}public void backtracking(int n, int k, int startIndex) {if (path.size() == k) {res.add(new ArrayList<>(path));return;}for (int i = startIndex; i <= n; i++) {path.add(i);backtracking(n, k, i+1);path.remove(path.size() - 1); // 回溯删除节点}}
}

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

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

相关文章

网络安全检查表

《网络攻击检查表》 1.应用安全漏洞 2.弱口令&#xff0c;默认口令 3.服务器互联网暴露 4.操作系统&#xff0c;中间件安全漏洞 5.研发服务器&#xff0c;邮件服务器等安全检查

python+django高校活动报名场地管理系统l1ro4

校园活动管理平台程序的开发&#xff0c;在数据库的选择上面&#xff0c;选择功能强大的MySQL数据库进行数据的存放操作。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5…

c++ 一个头文件包含多个头文件预处理编译指令#ifndef cin

一个头文件包含多个头文件 #ifndef MERGED_HEADER_H #define MERGED_HEADER_H#ifndef MATH_UTILS_H #include "math_utils.h" #endif#ifndef STRING_UTILS_H #include "string_utils.h" #endif#endif在其他源文件中&#xff0c;只需包含 merged_header.h …

交叉熵损失函数(Cross-Entropy Loss)的基本概念与程序代码

交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;是机器学习和深度学习中常用的损失函数之一&#xff0c;用于分类问题。其基本概念如下&#xff1a; 1. 基本解释&#xff1a; 交叉熵损失函数衡量了模型预测的概率分布与真实概率分布之间的差异。在分类问题中&…

linux下ipconfig命令报:command not found 解决方法

参考博文&#xff1a; linux下ipconfig命令报:command not found 解决方法 CentOS7更新yum报Could not resolve host:mirrorlist.centos.org; Unknown error解决办法

re:从0开始的CSS学习之路 11. 盒子垂直布局

1. 盒子的垂直布局的注意 若两个“相邻”垂直摆放的盒子&#xff0c;上面盒子的下外边距与下面盒子的上外边距会发生重叠&#xff0c;称为外边距合并 若合并后&#xff0c;外边距会选择重叠外边距的较大值 若两个盒子具有父子关系&#xff0c;则两个盒子的上外边距会发生重叠&…

MySQL 聚合函数解析与示例

介绍: 在MySQL中,聚合函数是用于对多行数据执行计算并返回单个结果的函数。这些函数对于分析数据和提取摘要信息非常有用。本文将介绍MySQL中常用的聚合函数,包括它们的功能、语法和示例用法。 1. MAX: 作用:查询指定列的最大值。 示例用法: SELECT MAX(salary) FROM …

1277. 统计全为 1 的正方形子矩阵

1277. 统计全为 1 的正方形子矩阵 题目链接&#xff1a;1277. 统计全为 1 的正方形子矩阵 代码如下&#xff1a; class Solution { public:int countSquares(vector<vector<int>>& matrix) {if(matrix.size()0||matrix[0].size()0) return 0;//dp[i][j]代表…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

Impala-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点2.框架优点3.框架限制 三、架构图1.Impala Daemon2.Statestore3.Catalog 四、Impala查询流程1.发起查询2.生成执行计划3.分配任务4.交换中间数据5.汇集结果6.返回结果 总结参考链接 一、背景和起源 现有的大数据查询分析工具H…

Android录音功能的实现及踩坑记录

最近接到个需求&#xff0c;不使用第三方SDK的情况下实现IM通讯&#xff0c;文字聊天已经通过MQTT实现&#xff0c;而语音功能目前想到的较好解决方案就是进行录音文件的上传下载。可能还有更好解决方案&#xff0c;但我目前没想到&#xff0c;有建议的小伙伴劳烦指导下。 前提…

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…

arduino ide esp32 网页按钮异步请求

前两天刚学&#xff0c;不咋懂&#xff0c;原理可以搜别的博主的文章&#xff0c;这是一个示例 #include<WiFi.h> #include<WebServer.h>#define ledpin 2const char* ssid"Your ssid"; //写你们家的WiFi名称 const char* password"Your password&…

[AIGC] 上传文件:后端处理还是直接阿里云OSS?

在构建Web应用时&#xff0c;我们经常需要处理用户上传的文件。这可能是图片、视频、文档等各种各样的文件。但是&#xff0c;上传文件的方式有很多种&#xff0c;最常见的两种方式是&#xff1a;通过后端处理&#xff0c;或者直接上传至云存储服务&#xff0c;如阿里云OSS。那…

Error和Exception有什么区别?Java中的OutOfMemoryError是什么?如何解决它?什么是Java中的异常处理的最佳实践?

Error和Exception有什么区别&#xff1f; Error和Exception在Java中都表示了某种问题或异常情况&#xff0c;但它们之间存在明显的区别。 严重性&#xff1a; Error&#xff1a;通常表示系统级错误或底层资源错误&#xff0c;如内存不足、系统崩溃等。这些错误是严重的&#x…

AES加密后的密码可以破解吗

AES&#xff08;高级加密标准&#xff09;是一种广泛使用的对称加密算法&#xff0c;设计用来抵御各种已知的攻击方法。AES使用固定块大小的加密块和密钥长度&#xff0c;通常是128、192或256位。它被认为是非常安全的&#xff0c;到目前为止&#xff0c;没有已知的可行方法能够…

【详解】斗地主随机发牌项目

目录 前言&#xff1a; 1.初始化牌 2.洗牌 3.揭牌 总代码&#xff1a; Card类&#xff1a; CardGame类&#xff1a; Main类&#xff1a; 结语&#xff1a; 前言&#xff1a; 斗地主是全国范围内的一种桌面游戏&#xff0c;本节我们来实现一下斗地主中的简单初始化牌、…

uniapp微信小程序开发踩坑日记:uni.request回调函数地狱问题

使用await和async无法解决uniapp中的回调函数地狱问题&#xff0c;因为uni.request并不返回一个 Promise。通常情况下&#xff0c;我们期望await能够等待一个 Promise 或者其它类似 Promise 的对象&#xff0c;然后继续执行下面的代码&#xff0c;但uni.request的 success 回调…

ComfyUI 安装和入门

目录 AnimateDiff for ComfyUI ComfyUI 入门教程 什么是ComfyUI&#xff1f; windows安装教程&#xff1a; 安装&#xff1a;stable-diffusion-webui 组件技巧学习 AnimateDiff for ComfyUI GitHub - ArtVentureX/comfyui-animatediff: AnimateDiff for ComfyUI 生成动画…

Spring Boot 笔记 006 创建接口_注册

1.1 由于返回数据都是以下这种格式&#xff0c;那么久再编写一个result实体类 报错了&#xff0c;原因是没有构造方法 可以使用lombok的注解自动生成&#xff0c;添加无参的构造器和全参的构造器 package com.geji.pojo;import lombok.AllArgsConstructor; import lombok.NoArg…