代码随想录刷题笔记 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.hqwc.cn/news/467657.html

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

相关文章

【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

解决MAC连上wifi或热点却不能上网问题

解决MAC连上wifi或热点却不能上网问题 #新换的mac昨天还能连上wifi&#xff0c;今天就不好使了。 找到连接的wifi点击详细信息&#xff0c;选择TCP/IP 中的配置IPV4 选择关闭

从零开始:Windows下的Miniconda安装教程

&#x1f680;从零开始&#xff1a;Windows下的Miniconda安装教程&#x1f680; &#x1f333;一、引言&#x1f333; 【&#x1f680;全新启程&#x1f680;】✨踏入Python数据科学的大门&#xff0c;&#x1f525;Miniconda&#x1f525;将成为您不可或缺的得力助手&#xf…

Spring Boot 笔记 007 创建接口_登录

1.1 登录接口需求 1.2 JWT令牌 1.2.1 JWT原理 1.2.2 引入JWT坐标 1.2.3 单元测试 1.2.3.1 引入springboot单元测试坐标 1.2.3.2 在单元测试文件夹中创建测试类 1.2.3.3 运行测试类中的生成和解析方法 package com.geji;import com.auth0.jwt.JWT; import com.auth0.jwt.JWTV…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

python-自动化篇-办公-批量新建文件夹并保存日志信息

文章目录 说明代码效果 说明 因为业务需要&#xff0c;每天都需要按当天的日期创建很多新文件夹。把这种重复又繁重的操作交给Python来做&#xff0c;一直是我的目标。先说下要求&#xff1a; 默认在桌面新建文件夹。文件夹命名方式&#xff0c;“月.日-1”&#xff0c;比如7…

全国计算机等级考试二级,Web考试大纲(2023年版)

基本要求 1.理解Web基本工作原理&#xff0c;掌握Web技术的基本概念和基础。 2.理解超文本传输协议 HTTP的基本概念和模型&#xff0c;掌握 HTTP的消息格式、常用消息头、请求消息和常用请求方法、响应消息和常用响应状态。 3.熟练掌握超文本标记语言 HTMl文档的结构、常用文档…

JavaWeb:SpingBoot原理 --黑马笔记

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

C++ 贪心 Huffman树 合并果子

在一个果园里&#xff0c;达达已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。 达达决定把所有的果子合成一堆。 每一次合并&#xff0c;达达可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。 可以看出&#xff0c;所有…

spring boot整合cache使用Ehcache 进行数据缓存

之前的文章 spring boot整合 cache 以redis服务 处理数据缓存 便捷开发 带着大家通过spring boot整合了 cache 缓存 那么 我们就来说说 其他服务的缓存 而spring boot默认的缓存方案就是 cache 用simple模式 spring boot的强大在于它的整合能力 它将其他缓存技术整合 统一了接…

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示 1 纹理 规则和不规则的 2 纹理的用处 从纹理中恢复形状 3 分割与合成 4 分析纹理进行分类 通过识别纹理分析物理性质 如何区分纹理 5 寻找有效的纹理分类方法 发现模式、描述区域内模式 A对应图2 B对应图…

LeetCode、1318. 或运算的最小翻转次数【中等,位运算】

文章目录 前言LeetCode、1318. 或运算的最小翻转次数【中等&#xff0c;位运算】题目链接与分类题解位运算 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…