代码随想录二刷 |回溯 | 组合

news2025/1/15 23:35:48

代码随想录二刷 |回溯 | 组合

  • 题目描述
  • 解题思路
  • 代码实现

题目描述

77.组合

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

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

解题思路

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

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

把组合问题抽象为如下树形结构:
在这里插入图片描述
可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。

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

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

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

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

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

回溯法三部曲:

  • 递归函数的返回值和参数
    定义两个全局变量,一个用来存放符合条件的单一结果,另一个存放符合条件结果的集合

    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    

    函数里一定有两个参数,既然是集合n里面取k个数,那么n和k是两个int型的参数。

    然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,…,n] )。

    从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。
    在这里插入图片描述
    所以需要startIndex来记录下一层递归,搜索的起始位置。

vector<vector<int>> result;
vector<int> path;
void backtracking(int n, int k, int startIndex);
  • 递归函数的终止条件
    path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了。

    此时用result二维数组把path保存起来,并终止本层递归。

    if (path.size() == k) {
    	result.push_back(path);
    	return;
    }
    
  • 单层搜索的过程
    for循环每次从startIndex开始遍历,然后用path保存取到的节点i。

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

代码实现

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

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

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

相关文章

浅析:HarmonyOS 一次开发多端部署

万物互联时代&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿设备。全新的全场景设备体验&#xff0c;正深入改变消费者的使用习惯&#xff0c; 同时应用开发者也面临设备底座从手机单设备到全场景多设备的转变&#xff0c;通过全场景多设备作为全新的底座&#xff0c;为…

Vue3+ElementUI 多选框中复选框和名字点击方法效果分离

现在的需求为 比如我点击了Option A &#xff0c;触发点击Option A的方法&#xff0c;并且复选框不会取消勾选&#xff0c;分离的方法。 <el-checkbox-group v-model"mapWork.model_checkArray.value"> <div class"naipTypeDom" v-for"item …

【GitHub项目推荐--最简洁的人脸识别库】【转载】

本项目是世界上最简洁的人脸识别库&#xff0c;你可以使用 Python 和命令行工具提取、识别、操作人脸。本项目的人脸识别是基于业内领先的 C 开源库 dlib 中的深度学习模型&#xff0c;用Labeled Faces in the Wild 人脸数据集进行测试&#xff0c;有高达 99.38% 的准确率。 …

年味渐近 其乐龍龍!2024四川省网联会年货节闪亮来袭!

1月19日&#xff0c;“其乐龍龍2024四川省网联会年货节”正式启动&#xff0c;此次活动由四川省网联会主办&#xff0c;以直播、短视频多种形式在抖音、微博、小红书等多平台同步呈现&#xff0c;旨在为广大消费者带来一场别开生面的年货盛宴&#xff0c;助力激发消费活力。 年…

1985-2022年企业级数字经济核心产业专利数据库

1985-2022年企业级数字经济核心产业专利数据库 1、时间&#xff1a;1985-2022年 2、指标&#xff1a;分类号类型、发明人、专利公开号、分类号、专利名称、主分类号、专利类型、代理机构、专利摘要、分案原申请号、申请人、优先权、专利申请号、国际申请、申请日、国际公布、…

ChatGPT时代对大数据应用的展望

前言&#xff1a; 2022年底&#xff0c;科技圈有个爆炸性新闻&#xff0c;ChatGPT的诞生&#xff0c;引发了世界范围内的震惊&#xff1b;人工智能在与人交流上有了划时代的技术突破&#xff0c;可以和人深入的理解交流&#xff0c;让许多公司和领域对这项技术有了更多遐想。对…

day25 组合总和Ⅲ 电话号码的字母组合

题目1&#xff1a;216 组合总和Ⅲ 题目链接&#xff1a;216 组合总和Ⅲ 题意 找出相加之和为n的k个数的组合 数字只可使用1~9之间的数&#xff08;包括 1 9&#xff09;且每个数字只能使用1遍 题目中有两个限制条件&#xff1a;1&#xff09;k个数 2&#xff09;k个…

HNU-数据挖掘-实验2-数据降维与可视化

数据挖掘课程实验实验2 数据降维与可视化 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验2 数据降维与可视化实验背景实验目标实验数据集说明实验参考步骤实验过程1.对数据进行初步降维2.使用无监督数据降维方法&#xff0c;比如PCA&#xff0c;I…

AttributeError: module ‘numpy‘ has no attribute ‘float‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Linux第32步_编译ST公司的TF-A源码

正点原子STM32MP157开发板使用的CPU型号是STM32MP157DAA1&#xff0c;而开发板硬件参考了ST公司的STM32MP157 EVK开发板&#xff0c;因此我们在移植的时候需要关注“stm32mp157d-ev1”。 一、了解SDK 包 ST公司会从ARM官方下载TF-A软件包&#xff0c;然后将STM32MP1 芯片添加…

实例分割中mIOU的定义是什么?

问题描述&#xff1a;实例分割中mIOU的定义是什么&#xff1f; 问题解答&#xff1a; mIOU&#xff08;Mean Intersection over Union&#xff09;是实例分割任务中常用的性能指标之一&#xff0c;用于评估模型的准确性。mIOU 是每个类别的 Intersection over Union&#xff…

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …

原子操作以及原子操作类AtomicInteger简介

前言 问&#xff1a;什么是原子操作 什么是原子操作&#xff0c;所谓原子操作&#xff0c;就是一个操作是不能打断的操作。确切的说应该是不备其他线程或者任务影响的操作。 没错&#xff0c;原子操作就是你在家里的一次上厕所的操作 >> 进厕所&#xff0c;上锁&#…

TPM模拟器安装

目录 TPM模拟器安装 1&#xff09;安装配置所需依赖 2&#xff09;从官网下载TPM模拟器程序ibmtpm1332.tar.gz 3&#xff09;创建安装目录并将源码解压到对应目录 4&#xff09;进入解压后的目录&#xff0c;然后执行安装命令 5&#xff09;将tpm服务器添到Linux系统执行目…

【蓝桥杯日记】复盘篇一:深入浅出顺序结构

&#x1f680;前言 本期是一篇关于顺序结构的题目的复盘,通过复盘基础知识&#xff0c;进而把基础知识学习牢固&#xff01;通过例题而进行复习基础知识。 &#x1f6a9;目录 前言 1.字符三角形 分析&#xff1a; 知识点&#xff1a; 代码如下 2. 字母转换 题目分析: 知…

申请开启|成为亚马逊云科技 Community Builder,共建云端社区!

在探索由技术打造的云端世界时&#xff0c;和同行者一起学习&#xff0c;与技术专家共同探讨是开发者成长的最佳助力&#xff01; 亚马逊云科技开发者社区 Community Builders 为技术爱好者和新兴思想领袖提供技术资源、学习和交流机会&#xff0c;帮助开发者探索、分享技术相关…

windows如何切换访问NAS共享文件夹用户

从资源管理器对NAS共享文件夹输入用户名与密码进行访问后&#xff0c;想切换访问用户&#xff0c;搜索了一圈&#xff0c;网上介绍的方法都无效&#xff0c;最后只能注销windows7登陆&#xff0c;然后重新登陆&#xff0c;再访问NAS共享时才能切换用户&#xff0c;各位观众如有…

智能文件管理,按数量自动新建文件夹归类

文件管理&#xff0c;一直以来都是许多人头疼的问题。当你拥有大量的文件时&#xff0c;如何有效地归类和整理这些文件就显得尤为重要。现在&#xff0c;我们为你带来了一款全新的文件管理工具&#xff0c;让你轻松实现按数量自动新建文件夹进行归类&#xff01; 首先第一步&am…

数据库(MySQL库表操作)

目录 1.1 SQL语句基础&#xff08;SQL命令&#xff09; 1.1.1 SQL的简介 1.1.2 SQL语句的分类 1.1.3 SQL语句的书写规范 1.2 数据库操作 1.2.1 查看 1.2.2 自建库 1.2.3 切换数据库 1.2.4 删库 1.3 MySQL字符集 1.3.1 MySQL字符集包括&#xff1a; 1.3.2 utf8 和 u…

审稿周期短,且出版效率高的10本医学类中文核心期刊推荐!

常笑医学整理了适合医务工作者进行论文投稿的10本医学类中文核心期刊&#xff0c; 以及期刊详细参数&#xff0c;供大家参考。 1.《保健医学研究与实践》 &#xff08;详细投稿信息请点击刊物名称查看&#xff09; 简介&#xff1a;《保健医学研究与实践》是中国高校保健医学研…