代码随想Day24 | 回溯法模板、77. 组合

news2025/1/23 17:36:51

理论基础 

回溯法和递归不可分割,回溯法是一种穷举的方法,通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程,可以抽象为树结构,回溯法的模板如下:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

 77. 组合  

这道题是回溯的经典题目,按照递归三步走:

参数:

在这里要定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合。函数里一定有两个参数,既然是集合n里面取k个数,那么n和k是两个int型的参数。

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

回溯函数结束条件:

path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,此时用result二维数组,把path保存起来,并终止本层递归。

单层搜索的过程

回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。

77.组合1

如此我们才遍历完图中的这棵树。for循环每次从startIndex开始遍历,然后用path保存取到的节点i。可以看出backtracking(递归函数)通过不断调用自己一直往深处遍历,总会遇到叶子节点,遇到了叶子节点就要返回。backtracking的下面部分就是回溯的操作了,撤销本次处理的结果。

此外:比较重要的剪枝部分:

可以剪枝的地方就在递归中每一层的for循环所选择的起始位置

如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。注意代码中i,就是for循环里选择的起始位置。

for (int i = startIndex; i <= n; i++) {

优化过程如下:

  1. 已经选择的元素个数:path.size();

  2. 还需要的元素个数为: k - path.size();

  3. 在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历

为什么有个+1呢,因为包括起始位置,我们要是一个左闭的集合。举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。

最终详细代码如下:

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

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

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

相关文章

【从0配置JAVA项目相关环境1】jdk + VSCode运行java + mysql + Navicat + 数据库本地化 + 启动java项目

从0配置JAVA项目相关环境 写在最前面一、安装Java的jdk环境1. 下载jdk2. 配置jdk3. 配置环境变量 二、在vscode中配置java运行环境1. 下载VSCode2. 下载并运行「Java Extension Pack」 三、安装mysql1.官网下载MySQL2.开始安装如果没有跳过安装成功 3.配置MySQL Server4.环境变…

InST论文复现

论文地址&#xff1a;https://arxiv.org/abs/2211.13203 论文git&#xff1a;https://github.com/zyxElsa/InST 遇到的问题&#xff1a; 1.requests.exceptions.SSLError: HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /openai/clip-…

机器学习 | RMSE和R平方误差的数学解释

RMSE&#xff1a;均方根误差是回归线拟合数据点的程度的度量。RMSE也可以解释为残差中的标准差。 考虑给定的数据点&#xff1a;&#xff08;1&#xff0c;1&#xff09;&#xff0c;&#xff08;2&#xff0c;2&#xff09;&#xff0c;&#xff08;2&#xff0c;3&#xff09…

java WebSocket带参数处理使用

1、webSocket实现代码 Component public class WebSocketStompConfig {//这个bean的注册,用于扫描带有ServerEndpoint的注解成为websocket// ,如果你使用外置的tomcat就不需要该配置文件Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpoi…

三十八、AT模式

目录 一、定义 1、AT模式工作原理如下&#xff1a; 2、优点&#xff1a; 3、缺点&#xff1a; 4、流程&#xff1a; 二、AT模式与XA模式的区别 三、AT模式的脏写问题 四、实现AT模式 一、定义 AT模式是指使用AT命令进行串口通信的工作模式。AT命令是由两个字符组成的命…

协同过滤算法之vue+springboot个性化电影评分推荐系统6n498

摘要为了解决信息过载问题,个性化推荐系统由此产生。个性化推荐系统通过对用户行为的分析,利用数据挖掘算法对信息进行过滤,将用户可能感兴趣的产品或项目推荐给用户。对于电影爱好者来说,利用网络在浩如烟海的电影数据库中找到自己喜欢的电影并非易事。电影作为一个艺术的载体…

ahk系列-windows超级运行框-表达式计算(6)—asc/ord/chr ASCII 码转换

1、环境准备 windows 7&#xff0c;8&#xff0c;10&#xff0c;11操作系统ahk 2.x_64位 2、使用方式 asc 可以计算 asc字符 &#xff0c;或者汉字&#xff0c;的数值&#xff0c;ord /chr 则是把数值转换为字符 当然有很多字符不可见&#xff0c;比如我们用 “{}” 包裹它…

软件测试之python+requests接口自动化测试框架实例教程

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

元宇宙解决方案:GPU云服务在元宇宙中的作用

GPU算力可以说是我们现在信息化时代的基础设施&#xff0c;在某种程度上说我们已经进入了算力时代&#xff0c;手机、电脑、车载等算力已经渗透到各行各业了。 当然算力对元宇宙也很重要&#xff0c;尤其是在可视化方面&#xff0c;元宇宙需要很逼真的渲染&#xff0c;同时它的…

【8】PyQt单选框和复选框

目录 1. 单选框 2. 复选框 1. 单选框 QRadioButton是单选按钮,它提供了一组可供选择的按钮和文本标签,用户可以选择其中一个选项 单选框选中的信号是:toggled 代码示例&#xff1a; from PyQt5.QtWidgets import * from PyQt5.QtCore import * import sysdef func(checked…

校园教务管理系统

学年论文&#xff08;课程设计&#xff09; 题目&#xff1a; 信息管理系统 校园教务管理系统 摘要&#xff1a;数据库技术是现代信息科学与技术的重要组成部分&#xff0c;是计算机数据处理与信息管理系统的核心&#xff0c;随着计算机技术的发展&#xff0c;数据库技…

docker:安装mysql以及最佳实践

文章目录 1、拉取镜像2、运行容器3、进入容器方式一方式二方式三容器进入后连接mysql和在宿主机连接mysql的区别 持久化数据持久化数据最佳实践 1、拉取镜像 docker pull mysql2、运行容器 docker run -d -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD123456 …

Python实现FA萤火虫优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

意大利语翻译成中文怎样做比较好

近年来&#xff0c;中意两国传统友好&#xff0c;两国人民之间的交往源远流长&#xff0c;双方合作不断推进&#xff0c;国内市场对于意大利语翻译的需求日益增加。那么&#xff0c;意大利语翻译有何特点&#xff0c;意大利语翻译成中文怎样做比较好呢&#xff1f; 由于意大利语…

matlab实践(十):贝塞尔曲线

1.贝塞尔曲线 贝塞尔曲线的原理是基于贝塞尔曲线的数学表达式和插值算法。 贝塞尔曲线的数学表达式可以通过控制点来定义。对于二次贝塞尔曲线&#xff0c;它由三个控制点P0、P1和P2组成&#xff0c;其中P0和P2是曲线的起点和终点&#xff0c;P1是曲线上的一个中间点。曲线上…

Leetcode每日一题学习训练——Python3版(最小化旅行的价格总和)

版本说明 当前版本号[20231206]。 版本修改说明20231206初版 目录 文章目录 版本说明目录最小化旅行的价格总和理解题目代码思路参考代码 原题可以点击此 2646. 最小化旅行的价格总和 前去练习。 最小化旅行的价格总和 现有一棵无向、无根的树&#xff0c;树中有 n 个节点…

LeetCode Hot100 207.课程表

题目&#xff1a; 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习…

人工智能在警务工作中的运用

AI 能否帮助警察打击犯罪&#xff1f; 执法部门负责维护公共安全&#xff0c;他们必须处理随之而来的所有挑战。幸运的是&#xff0c;警察可以依靠技术来处理很多工作。近几年来&#xff0c;尤其是人工智能技术在全球变成了警务工作中的一个重要部分。 随着基于 AI 的警务技术…

如何在Java中实现多条件排序

文章目录 前言一、在Java中使用Comparator接口实现多条件排序二、视频讲解总结 前言 多条件排序是一个复杂而实用的技术问题&#xff0c;它涉及到算法、数据结构等多个领域。 在实际工作中&#xff0c;我们常常需要根据多个条件对数据进行排序&#xff0c;以达到最优化的效果。…

桶排序去重

题目&#xff1a; #include<stdio.h> int main() { int a[1001], n, i, t; for (i 1;i < 1000;i) { a[i] 0;//初始化 } scanf("%d", &n);//读入n for (i 1;i < n;i)//循环读入n个图书的ISBN号 { scanf(&…