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

news2024/10/6 22:22:32

文章目录

    • 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.coloradmin.cn/o/1446256.html

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

相关文章

Kafka 入门笔记

课程地址 概述 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff09; 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息 消息队列 消息队…

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

lv15 驱动高级设备模型 1

之前的驱动操作称为硬编 一、起源 仅devfs&#xff08;dev目录&#xff09;&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔&#xff08;如何插入一个设备然后找到设备的驱动应用到程序中&#xff09; 不支持一些针对所有设备的统一操作&#xff08;如电…

【51单片机】AT24C02(江科大、爱上半导体)

一、AT24C02 1.AT24C02介绍 AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息 存储介质:E2PROM 通讯接口:12C总线 容量:256字节 2.引脚即应用电路 本开发板AT24C02原理图 12C地址全接地,即全为0 WE接地,没有写使能 SCL接P21 S…

无人机飞行原理,多旋翼无人机飞行原理详解

多旋翼无人机升空飞行的首要条件是动力&#xff0c;有了动力才能驱动旋粪旋转&#xff0c;才能产生克服重力所必需的升力。使旋翼产生升力&#xff0c;进而推动多旋翼无人机升空飞行的一套设备装置称为动力装置&#xff0c;包括多旋翼无人机的发动机以及保证发动机正常工作所必…

Could not determine ref type of version: remote: Invalid credentials

在按照别人代码的README配置环境时&#xff0c;需要clone很多库&#xff0c;但是有一个库一直下不下来。 解决办法&#xff0c;直接上github搜索该库&#xff0c;选好相应的版本tag&#xff0c; git clone -b <branch_name> <link>下载即可。

计算机网络——04接入网和物理媒体

接入网和物理媒体 接入网络和物理媒体 怎样将端系统和边缘路由器连接&#xff1f; 住宅接入网络单位接入网络&#xff08;学校、公司&#xff09;无线接入网络 住宅接入&#xff1a;modem 将上网数据调制加载到音频信号上&#xff0c;在电话线上传输&#xff0c;在局端将其…

InternLM大模型实战-5.LMDeploy大模型量化部署实战

文章目录 前言笔记正文大模型部署背景部署挑战部署方案 LMDeploy框架量化推理引擎Turbomind推理服务api server 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记 【LMDeploy 大模型量化部署实践】 https://www.bilibili.com/video/BV1iW4y1A77P/?share_sourcecopy_…

《Linux 简易速速上手小册》第4章: 包管理与软件安装(2024 最新版)

文章目录 4.1 包管理基础4.1.1 重点基础知识4.1.2 重点案例&#xff1a;在 Ubuntu 上安装和管理软件4.1.3 拓展案例 1&#xff1a;添加软件仓库4.1.4 拓展案例 2&#xff1a;回滚软件到旧版本 4.2 使用 APT 与 YUM4.2.1 重点基础知识4.2.2 重点案例&#xff1a;在 Ubuntu 上配置…

Python||数据分析之pyecharts 绘图(词云、气泡)

1. echarts 和 Pyecharts 简介 1.1echarts 简介: • echarts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 • echarts 遵循 Apache-2.0 开源协议,免费商用。 • ECharts 最初由百度团队开源,并于 2018 年初捐赠给 Apache 基金会,成为 AS…

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称&#xff1a; /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…

HTTP协议-请求Request

前言&#xff1a; 序列&#xff1a;HTTP - 002 1.请求格式 1.1标椎格式 HTTP请求是字符串的格式传输&#xff0c;具体包含以下四部分&#xff1a; 首行&#xff1a;[方法][url][版本号]&#xff0c;分别使用空格分隔&#xff1b;请求头&#xff08;Header&#xff09;&#…

Verilog刷题笔记30

题目&#xff1a; You are provided with a BCD one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out. 解题&#xff1a; module top_module( input [399:0] a, b,input cin,output cout,output [399:0] sum );reg [99…

【程序设计竞赛】竞赛中的细节优化

必须强调下&#xff0c;以下的任意一种优化&#xff0c;都应该是在本身采用的算法没有任何问题情况下的“锦上添花”&#xff0c;而不是“雪中送炭”。 如果下面的说法存在误导&#xff0c;请专业大佬评论指正 读写优化 C读写优化——解除流绑定 在ACM里&#xff0c;经常出现…

GO 的 Web 开发系列(五)—— 使用 Swagger 生成一份好看的接口文档

经过前面的文章&#xff0c;已经完成了 Web 系统基础功能的搭建&#xff0c;也实现了 API 接口、HTML 模板渲染等功能。接下来要做的就是使用 Swagger 工具&#xff0c;为这些 Api 接口生成一份好看的接口文档。 一、写注释 注释是 Swagger 的灵魂&#xff0c;Swagger 是通过…

Microsoft OneNote 图片文字提取

Microsoft OneNote 图片文字提取 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本2. 插入图片​​​3. 复制图片中的文本References 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本 ​ 2. 插入图片 ​​​3. 复制图片…

Material Design

1.使用颜色 2. 处理文本 3.处理形状 ​​​​​​

书生·浦语大模型第五课作业

基础作业&#xff1a; 使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型&#xff0c;生成 300 字的小故事&#xff08;需截图&#xff09; 这里 /share/conda_envs 目录下的环境是官方未大家准备好的基础环境&#xff0c;因为该目录是共…