代码随想录算法训练营第二十四天 | 理论基础、 77. 组合

news2024/11/28 2:34:29

打卡24天,今天学第七章回溯算法,之前已经学过一遍,现在学第二遍,加油。

今日任务

  • 理论基础
  • 77.组合

理论基础

什么是回溯

递归的副产物,有递归就会有回溯

在这里插入图片描述
红色的箭头就是回溯

回溯的效率

回溯的本质是穷举穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质,所以回溯法的效率不高。

回溯解决的问题

  • 组合问题
  • 排列问题
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 切割问题
  • 棋盘问题:n皇后问题、解数独

如何用回溯法

所有回溯法解决的问题都可以抽象为树形结构。

因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

回溯法模板

回溯函数模板返回值以及参数

  • 回溯算法中函数返回值一般为void。

  • 回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数

void backtracking(参数)

回溯法的终止条件

什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。

if (终止条件) {
    存放结果;
    return;
}

回溯搜索的遍历过程

for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
    处理节点;
    backtracking(路径,选择列表); // 递归
    回溯,撤销处理结果
}

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

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

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

77.组合

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。

在这里插入图片描述

代码随想录

  • 抽象成树形结构
    在这里插入图片描述
    结点只是画出一部分,右边空白区还有结点的

  • 定义一个二维数组res,存放结果集,定义一个以为数组path,用来存放符合条件的结点

  • 确定递归出口:当 path 的长度等于 k ,说明已经收集到另一个结果,存入结果集

  • 单层逻辑

    for (int i = startIndex; i <= n; i++) { // 控制树的横向遍历
    	path.push_back(i); // 处理节点 
    	backtracking(n, k, i + 1); // 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始
    	path.pop_back(); // 回溯,撤销处理的节点
    }
    
  • 发现需要参数 n ,k, 还需要每次从startIndex开始遍历。

class Solution {
public:
    vector<vector<int> > res;
    vector<int> path;
    void backtracking(int n, int startIndex, int k) {
        if(path.size() == k) {
            res.push_back(path);
            return ;
        }
        for(int i = startIndex; i <= n; i++) {
            path.push_back(i);
            backtracking(n, i + 1, k);
            path.pop_back();
        }

    }
    vector<vector<int>> combine(int n, int k) {
        res.clear();
        path.clear();
        backtracking(n, 1, k);
        return res;
    }
};

优化剪枝
当 n = 4, k = 4,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层for循环,从元素3开始的遍历都没有意义了。

所以优化之后的for循环是:

for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置

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

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

相关文章

ROS通信机制

参考&#xff1a; bilibiliAutolabor官方 回调函数&#xff1a;&#xff01; 由外部中断激发而执行的函数&#xff0c;函数执行的时间不由函数本身控制&#xff0c;而是由外部激发 1、话题通信 ​ publisher发布者&#xff0c;和subscriber订阅者通过topic相互连接&#xf…

设计模式5——自定义Spring框架

1、Spring核心功能结构 Spring大约有20个模块&#xff0c;由1300多个不同的文件构成。这些模块可以分为&#xff1a;核心容器、AOP和设备支持、数据访问与集成、Web组件、通信报文和集成测试等。下面是Spring框架的整体架构图&#xff1a; 核心容器由beans、core、context 和 …

Vue脚手架的安装(保姆级教程)

Vue脚手架的安装&#xff08;保姆级教程&#xff09; 文章目录Vue脚手架的安装&#xff08;保姆级教程&#xff09;1.下载vscode2.node下载5.Vue脚手架的安装6.创建Vue项目7.项目的运行1.下载vscode vscode下载地址 2.node下载 node下载 1.打开cmd node -vnpm -v2.在node的…

linux入门---vim的配置

这里写目录标题预备知识如何配置vimvim一键配置预备知识 在配置vim之前大家首先得知道一件事就是vim的配置是一人一份的&#xff0c;每个用户配置的vim都是自己的vim&#xff0c;不会影响到其他人&#xff0c;比如说用户xbb配置的vim是不会影响到用户wj的&#xff0c;虽然不同…

开源写作平台WriteFreely(折腾篇)

设置向导 除了直接修改 config.ini 之外&#xff0c;你还可以进入容器用命令行进行设置 在 SSH 客户端执行下面的命令 # 生成 config.ini docker exec -it writefreely ./writefreely --config也可以通过群晖的 终端机 一步一步跟着填入就可以了&#xff0c;但是需要说明的是…

Zhong__Celery基本使用详解

时间&#xff1a;2023.03.10环境&#xff1a;python3/centos/redis目的&#xff1a;演示celery基本使用的详细案例说明&#xff1a;python依赖的版本以requirement.txt文件为测试基准 不同版本可能存在差异作者&#xff1a;Zhong简介简介及概念介绍部分不会很详细 主要看demo项…

【HTTP协议与Web服务器】

HTTP协议与Web服务器浏览器与服务器通信过程HTTP的请求报头HTTP请求报头结构HTTP的请求方法HTTP应答报头HTTP应答报头结构应答状态web服务器的c语言实现浏览器与服务器通信过程 浏览器与Web服务器再应用层通信使用的是HTTP协议&#xff0c;而HTTP协议在传输层使用的是TCP协议。…

深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化

在深度学习中&#xff0c;第一步要做的往往就是处理数据集,尤其是学习百度飞桨PaddlePaddle的小伙伴&#xff0c;数据集经常要用Voc格式的&#xff0c;比如性能突出的ppyolo等模型。所以学会数据集转化的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化&…

数据库系统概论

文章目录前言基础篇&#xff1a;1-5章第 1 章 绪论1.1 数据库系统概述1.2 数据模型1.3 数据库系统的结构1.4 数据库系统的组成1.5 小结第 2 章 关系数据库1.关系模型1.1 关系数据结构1.2 关系完整性约束实体完整性、参照完整性、用户定义完整性2.关系代数8种关系代数运算符并 ∪…

「媒体邀约」如何选择适合的媒体公关,媒体服务供应商

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 每天胡老师也会接到大量关于媒体方面的询问&#xff0c;胡老师也都一一的很耐心的进行了解答&#xff0c;也都很详细的做了媒体规划和媒体传播方案&#xff0c;但有的朋友还是很犹豫&…

关于 @Aspect 注解的使用

一、Spring AOPAOP(Aspect Oriented Programming) 是一种面向切面的编程思想。面向切面编程是将程序抽象成各个切面&#xff0c;即解剖对象的内部&#xff0c;将那些影响了多个类的公共行为抽取到一个可重用模块里&#xff0c;减少系统的重复代码&#xff0c;降低模块间的耦合度…

Hive小结

Hive的定义hive是一个建立在Hadoop上的开源数据仓库软件&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为hive查询语言&#xff08;HQL&#xff09;&#xff0c;用于访问和分析存储在Hadoop文件中的大型数…

Uipath Excel 自动化系列12-InsertDeleteSheet(新增删除Sheet)

活动描述 Insert Sheet 新增Sheet:在 Excel 文件中插入工作表,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 Delete Sheet 删除Sheet:从 Excel 文件中删除指定工作表,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图&#xff1a; Inser…

【React教程】一、React简介

一、React简介 React是一个用于构建用户界面的JavaScript库&#xff0c;它是Facebook的内部项目&#xff0c;用来架设Instagram的网站,并于2013年5月开源。React主要用于构建Ul&#xff0c;很多人认为React 是 MVC 中的 V&#xff08;视图&#xff09;。由于拥有较高的性能&…

计算机组成原理——计算机系统概述

文章目录计算机系统的组成计算机硬件冯诺依曼结构计算机的功能部件计算机软件系统软件和应用软件三个级别的语言计算机的性能指标字长数据通路宽度主存容量运算速度计算机系统的组成 计算机系统由硬件系统和软件系统组成&#xff1a; 硬件是指有形的物理设备&#xff0c;是计…

【CICD】如何编写 .gitlab-ci.yml 文件

⏳ CICD 指的是持续集成/持续交付&#xff08;continuous integration/ continuous delivery&#xff09;&#xff0c;是为了满足互联网、金融公司快速迭代项目的需要而提出的一种软件开发思想。大致思路是通过编写自动化脚本&#xff0c;使新代码必须通过一些规则核查后才能部…

自定义控件(?/N) - 事件分发

一、外部传递到ViewGroup中Activity会通过 getWindow( ) 获取PhoneWindow对象并调用它的superDispatchTouchEvent( )&#xff0c;该方法会调用它&#xff08;PhoneWindow&#xff09;的内部类 DecorView 的 superDispatchTouchEvent( )&#xff0c;而它&#xff08;DecorView&a…

【Docker】P1 初识 Docker 以及 Ubuntu 安装 Docker

初识 Docker 以及 Ubuntu 安装 Docker初识 Docker故事引入DockerUbuntu 安装 Docker读完本文&#xff0c;你应当会理解这两句话&#xff1a; Docker 可以大大简化运维部署相关操作&#xff0c;可以规避一些 bug&#xff1b; Docker 是一种容器技术&#xff0c;解决软件跨环境迁…

使用Houdini输出四面体网格并输出tetgen格式

我们的目标是从houdini输出生成的四面体&#xff0c;希望是tetgen格式的。 众所周知&#xff0c;houdini是不能直接输出四面体的。 有三方案去解决&#xff1a; 输出点云ply文件&#xff0c;然后利用tetgen生成网格。输出Hounidi内置的.geo格式文件&#xff0c;然后写个脚本…

[Java Web]Request对象 | 超1w字带你熟悉Servlet中的request请求

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章 ⭐所属专栏&#xff1a;Java Web ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601; 目录 Reque…