回溯算法-组合问题-力扣第77题

什么是组合问题——

举例:

有一个集合:{1,2,3,4}

现在要找出这个集合里面所有组合大小(组合长度,组合里面数据的个数)为2的组合

那么就有:总共6种组合

{1,2},{1,3},{1,4}

            {2,3},{2,4}

                        {3,4}

注意:

组合问题是无序的,即{1,2}={2,1},只算一种

排序问题是有序的,{1,2}和{2,1}是算两种

题目:

给定两个整数 n 和 k,返回 1 到 n 中所有可能的 k 个数的组合。

这里n指原组合大小长度(即所给组合中数据的个数),也就是sizeof(数组)

如{1,2,3,4},则n=4

k指需要输出的新组合的大小

如要找出这个集合里面所有组合大小(组合长度,组合里面数据的个数)为2的组合

则k=2

那么就有:总共6种组合

{1,2},{1,3},{1,4}

            {2,3},{2,4}

                        {3,4}

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

先是直接也暴力的查找方法,for循环,挨个找,然后经过for循环里面的操作进行组合,完成后打印输出 i j 就是要求的组合

如果n为100,k为50呢,那就50层for循环,是不是开始窒息。

此时就会发现虽然想暴力搜索,但是用for循环嵌套连暴力都写不出来!

咋整——为什么要用回溯法

回溯搜索法来了,虽然回溯法也是纯暴力方式,但至少能写出来,不像for循环嵌套k层让人绝望。

那么回溯法怎么暴力搜呢?

上面我们说了要解决 n为100,k为50的情况,暴力写法需要嵌套50层for循环,

那么回溯法就用递归来解决嵌套层数的问题——

回溯算法通过递归,来控制有多少层for循环

递归里的每一次其实是一个for循环,然后下一个递归就是下一层for循环

递归来做层叠嵌套(可以理解是开k层for循环),每一次的递归中嵌套一个for循环,那么递归就可以用于解决多层嵌套循环的问题了

此时递归的层数大家应该知道了,例如:n为100,k为50的情况下,就是递归50层。

如何使用回溯算法解决问题——一般能用回溯算法解决的问题,我们都可以把抽象为一个树形结构(N叉树)

用树形结构来理解回溯,模拟回溯搜索的过程,就容易多了

可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。

第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。

每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围

直到取4时,可选择范围为空了,那么明显该分支是一个得不到结果的分支了,就应该是被叉掉的分支了,后面回说剪枝问题操作

图中可以发现n相当于树的宽度,k相当于树的深度

那么如何在这个树上遍历,然后收集到我们要的结果集呢

图中每次搜索到了叶子节点,我们就找到了一个结果

相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。

注意:求组合问题,第一组合无序,前面选择过了,后面就不选择了

第二组合里的元素不可以重复使用,即不会出现{1,1},{2,2},{3,3}等的情况

所以在取1的集合中,可选择的范围就是数据1之后,后面的所有数据;取2就是2后面的

那么如何达到这个效果,在后面每次递归通过传入一个参数,起名叫【startIndex】,来控制每次搜索的起始位置

回溯三部曲

递归里面嵌套for循环,for循环里面再嵌套递归,会很懵

所以有一个回溯算法的模版,其分为3个部分

回溯靠递归来实现,所以回溯函数就是递归函数

下来我们要确定以下3部分

  • 递归函数的返回值以及参数
  • 确定递归的终止条件(终止条件处理不好的话,递归就是一个死循环)
  • 确定单层搜索的逻辑(即单层递归的逻辑)

一.递归函数的返回值以及参数

递归函数的返回值一般情况下都是void,但在求回溯算法的时候,递归函数才有返回值

函数名字通常情况大家都叫backtracking

void  backtracking(        )

下来()内就要确定参数了,看参数有哪些

首先一个组合,可以理解看成是一个一维数组,给它取名叫做path,

即树形结构中路径的意思

可以看到,最终我们求到的组合结果,就是一个个叶子结点,即一条条路径顺下来的结果

其就是一个收集路径的过程

那么这个组合怎么取,怎么存放

我们还需要定义一个二维数组(名字叫做result)——把整个,所有收集来的组合,存放在一起,

然后以一个结果集的方式,返回回去——(这也是力扣题中要求的返回结果的方式)

这里的path和result,都定义为全局变量;

也可以是放到()中作参数,给它定义成一个引用的方式,但这样会让参数过多,影响代码的可读性,

所以还是放到全局变量里

继续看参数里还需要什么——总共3个

首先需要n和k,然后就是我们刚说的startIndex(每次搜索前都传进来一个当前的起始位置)

二.确定递归的终止条件

通过树形结构可以直观看到,每个叶子结点(没有孩子的结点)就是我们想要的结果,即终止

那么如何到叶子结点呢,前面我们用pass收集路径结果组合,而我们想要的组合大小k为2

那么当pass的大小等于k时,说明找到了一个大小为k的组合了,则不用路径再往下走了,此时的叶子结点就是结果

终止条件:

if(pass.size==k)

{   

//收割叶子结点的结果 ,此时pass里面存放的已经是某条路径下的叶子组合结果了

     result数组收集

return

}

三.确定单层搜索的逻辑

在树形结构里,每一个结点都是一个for循环,它的起始位置(是1还是2,3,4)由startIndex决定开始

在单层搜索的每一个i里面,当前的i都有pass数组来收集这个路径上的元素叶子结点

然后从当前i开始递归,其纵向的下一层的startIndex从i+1开始

最后回溯,pass撤销处理的结点,把之前收集的结果弹出去

举例说明:

刚收集了12,那么接下来就要把2弹出去,剩下1,再跟新加进来的3,组合成13,同理:14

所以回溯(pop)就是再回到1没跟2组合之前还是1的状态

如果没有回溯的过程,一直是递归之下,那么它就会一直往里面加数据,就是1234而不是12,13,14了

12,13,14完成之后就把4弹出,再把1弹出,把2加进来,把3加进来,组合23,谈3进4,24,依次类推

也就是上图中取2,取3,取4类似于画英文字母M的过程,下来再上去再下来,就是树形结构选取每个分支的过程

​​​​​​​

回溯算法模版

剪枝优化

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

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

相关文章

ubuntu在conda环境中使用 pip install -r requirements.txt但是没有安装在虚拟环境中

whereis pip pip listubuntu在conda环境中使用pip install lpips0.1.3 但是安装在了这里 Requirement already satisfied: lpips0.1.3 in /home/uriky/anaconda3/lib/python3.11/site-packages (0.1.3) 就会出现黄色波浪,未在虚拟环境中安装包 解决办法1&#xff1…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天,为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度,还能提升转化率,促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广,可以通过发布产品信息、用户评价和促…

GAME101-Lecture07学习

前言 今天主要讲shading(着色)。在讲着色前,要先讲图形中三角形出现遮挡问题的方法(深度缓存或缓冲)。 先采样再模糊错误:对信号的频谱进行翻译(在这期间会有频谱的混叠)&#xff…

Windows安装Django

1、下载Python程序包 Python程序包官网下载地址Download Python | Python.org,若下载最新版本,有最新版本则下载"Windows installer (64-bit)" 若是下载其他版本,可在下图位置找到相应的版本,然后点击Download.如下图所示: 打开后查看注意事项…

单位个人怎样向报社的报纸投稿?

作为一名单位的信息宣传员,我肩负着每月定期在媒体上投稿发表文章的重任。然而,在投稿的道路上,我经历了不少波折和挫折。 一开始,我天真地以为只要将稿件发送到报社的投稿邮箱,就能轻松完成任务。然而,现实却远比我想象的复杂。邮箱投稿的竞争异常激烈,编辑们会在众多稿件中挑…

XMind 头脑风暴/思维导图软件_V24.04.10291 PC高级版

一款风靡全球的头脑风暴和思维导图软件,为激发灵感和创意而生。在国内使用广泛,拥有强大的功能,包括思维管理,商务演示,与办公软件协同工作等功能。XMind中文版采用全球先进的Eclipse RCP软件架构,是集思维…

Qwen 开源标杆

Qwen的博客 在线体验Qwen开源版本、非常丝滑 不算量化、已经开源的Qwen1.5 版本有9个: 0.5B、1.8B、4B、7B、14B、32B、72B、110B、MoE-A2.7B 闭源已经发展到 Qwen-Max-0428、网页端从2.1升级到2.5 Qwen API详情 一些记录: 1、Qwen1.5 110B&#x…

我的dcd爬虫-Python

我自己写的dcd爬虫,这个网站比较简单。看了看别人的程序,觉得用起来挺别扭,就自己捣鼓了一天。弄出来了。 这个网站没有反爬,有一些是动态网页,有一些是静态。 首先,获取销量排行榜前300的车型。 import…

快速上手并行执行——《OceanBase 并行执行》 系列 7

并行执确实是一个涵盖多个层面的复杂主题,它需要投入一定的时间和精力来深入理解,才能充分掌握其功能。为了帮助初学者更快地掌握并行执行的技巧,我们提供了这份Quick Start,它适用于 OceanBase 3.1版本及以上的版本。虽然这里所…

浅谈内存泄漏

内存泄漏 概念 在JavaScript中,内存泄漏是指应用程序在不再需要使用某块内存时仍然保持对其的引用,导致内存不能被垃圾回收机制释放,最终导致内存占用过高,性能下降。 内存泄漏通常发生在以下情况: 全局变量&#…

macos安装mysql一直卡在安装成功那个页面选项的解决办法

问题描述: 我安装的是比较新的版本8.0.37,安装过程中一直卡在安装那个选项上,且页面提示安装成功了,但就是死活不往下面的配置选项那一步走。 解决办法: 1.首先清理掉之前的mysql sudo rm -rf /usr/local/mysql2.然…

win11快速安装mysql数据库系统

win11快速安装mysql数据库系统 1、下载 1.1 打开官网 1.2 向下滚动页面 1.3 进入下载选项 1.4 下载8.0.4 LTS 1.5 开始下载 1.6 下载中 2、解压 大家注意,此时解压后目录是没有data目录的。 3、数据库初始化 3.1 管理员身份打开CMD 开始菜单上,输入…

代码随想录算法训练营第三十一天|455.分发饼干,376. 摆动序列,53. 最大子序和

455.分发饼干 优先把小饼干分给胃口值小的&#xff0c;或者是把大饼干分给胃口大的。 376. 摆动序列 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size();int curDiff 0; // 当前一对差值int preDiff …

详解绝对路径和相对路径的区别

绝对路径和相对路径是用于描述文件或目录在文件系统中位置的两种不同方式。 绝对路径&#xff08;Absolute Path&#xff09;是从文件系统的根目录开始的完整路径&#xff0c;可以唯一地确定一个文件或目录的位置。在不同的操作系统中&#xff0c;根目录的表示方式可能略有不同…

SpringSecurity安全过滤器工作原理

前面通过三篇文章&#xff0c;从底层代码的角度分析了SpringSecurity的初始化过程。 接下来我们就要具体看一下&#xff0c;Spring Security的安全过滤器初始化、装配好之后&#xff0c;到底是怎么工作的。 还是按图索骥 下面我们简单从底层源码分析一下&#xff0c;请求是怎…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂&#xff08;上衣、下装&#xff09;定义产品定义具体生产产品&#xff08;上衣、下装&#xff09; 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中&#xff0c;父类决定实例的生成方式&#xff0c;但…

图像/视频恢复和增强CodeFormer

github&#xff1a;https://github.com/sczhou/CodeFormer 尝试增强旧照片/修复人工智能艺术 面部修复 面部色彩增强和恢复 脸部修复

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 核支持向量机 1、线性模型与非线性特征 …

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …