代码随想录算法训练营第二十四天 | 回溯算法

news2025/2/3 23:59:48

目录

力扣题目

回溯理论基础

力扣题目记录

77. 组合

剪枝 

 总结


力扣题目

77. 组合


回溯理论基础

  1. 暴力解法
  2. 和递归一起用
  3. 类似for循环

基本模板:

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

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

详情如下:

参考:代码随想录


力扣题目记录

77. 组合

  1. 类似递归,写的时候有三部曲
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;
    }
};
  • 时间复杂度: O(n * 2^n)
  • 空间复杂度: O(n)

剪枝 

我们说过,回溯法虽然是暴力搜索,但也有时候可以有点剪枝优化一下的。

在遍历的过程中有如下代码:

for (int i = startIndex; i <= n; i++) {
    path.push_back(i);
    backtracking(n, k, i + 1);
    path.pop_back();
}

这个遍历的范围是可以剪枝优化的,怎么优化呢?

来举一个例子,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层for循环,从元素3开始的遍历都没有意义了。

这么说有点抽象,如图所示:

77.组合4

图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。

所以,可以剪枝的地方就在递归中每一层的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。

从2开始搜索都是合理的,可以是组合[2, 3, 4]。

这里大家想不懂的话,建议也举一个例子,就知道是不是要+1了。

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

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

优化后整体代码如下:

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 - (k - path.size()) + 1; i++) { // 优化的地方
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1);
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:

    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};

详见:代码随想录 


 总结

        今天正式开始学习回溯了,了解了回溯的基本框架,明白了剪枝该怎么写

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

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

相关文章

常见的弧形导轨有哪些

弧形导轨又叫圆弧导轨、滚轮圆弧导轨&#xff0c;是通过v形滚轮在圆弧v型导轨表面滚动&#xff0c;作圆周运动&#xff0c;运用广泛&#xff1a;数控机床、包装机械、输送设备、医疗器械、航空航天等设备&#xff1b;弧形导轨也分几种&#xff0c;常见的弧形导轨有以下几种&…

朱卫明与《有缘无分》:缘分、梦想与音乐的交织

朱卫明与《有缘无分》&#xff1a;缘分、梦想与音乐的交织 朱卫明&#xff0c;音乐制作人、歌手&#xff0c;他用自己的方式诠释着音乐与生活的密切关系。在他的代表作《有缘无分》中&#xff0c;我们不仅听到了他对缘分的独特理解&#xff0c;还感受到了他在追求音乐梦想道路…

MSA【4】:DeSAM

文章目录 前言1. Abstract & Introduction1.1. Abstract1.2. Introduction1.2.1. Brief Introduction1.2.2. Motivation1.2.3. Contribution 2. Methods2.1. Architecture2.1.1. DeSAM Encoder2.1.2. Prompt-Relevant IoU Module (PRIM)2.1.3. Prompt-Invariant Mask Modul…

24、DHFormer :残差模块+Transformer,用了之后[腰不酸腿不疼了],世界一下子变得清晰了!

论文&#xff1a; 《DHFormer: A Vision Transformer-Based Attention Module for Image Dehazing》 本文由昌迪加尔大学于2023年12月15日发表于arXiv的《Computer Science》 链接&#xff1a; [2312.09955] DHFormer: A Vision Transformer-Based Attention Module for Im…

电脑文件msvcp140.dll丢失该怎么解决?靠谱的msvcp140.dll修复方法

面对计算机系统报告的msvcp140.dll文件丢失警报&#xff0c;这个问题可能会阻碍依赖此特定动态链接库(DLL)的一些程序的正常启动和运行。解决msvcp140.dll文件丢失的问题对于保障相关应用程序能够无障碍操作非常关键&#xff0c;并且这还是确保计算机系统保持高效稳定运行的必要…

【MYSQL】MYSQL 的学习教程(六)之 SQL 语句执行流程

1. 一条 SQL 查询语句是如何被执行的 MySQL 的基本架构示意图如下所示&#xff1a; MYSQL 线程处理请求流程&#xff1a; SQL 接口&#xff1a;MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理查询解析器&#xff1a;解析器会将 SQL 接口传递过来…

“开放原子开源大赛”inBuilder低代码开发分赛道圆满落幕,听听他们怎么说!

近日&#xff0c;开放原子开源大赛—“基于inBuilder低代码平台开源社区版的应用开发”创新赛决赛路演在无锡圆满落幕。 作为首届开放原子开源大赛&#xff0c;其由开放原子开源基金会牵头发起&#xff0c;央视网、江苏省工业和信息化厅、无锡市人民政府、江苏软件产业人才发展…

Vue.js 教程

Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 阅读本教程前&#xff0c;您需要了解的…

【3d】designdoll 人偶 --- 修复手部

示例图&#xff1a; 打开人偶软件 设置手部细节 制作一个手型 方法一&#xff1a;krita live 修手&#xff08;推荐&#xff09; 将手型导入krita live生图&#xff0c;用框选工具框选手部 如果效果不好&#xff0c;请使用种子数。 方法二&#xff1a;PS SD修手&#xff08;不…

51单片机相关寄存器

前言 单片机复习的时候对应寄存器的记忆感觉很混乱&#xff0c;这里进行一下整理,后面的单词是我用来辅助记忆的&#xff0c;可能并不是表示原本的含义。 P3口的第二功能 0RXD 串行数据输入口 1TXD串行数据输出口2INT0外部中断0输入3INT1外部中断1输入4T0定时器0外部计数输入…

云上荆楚丨云轴科技ZStack成功实践精选(湖北)

湖北自古以来有九省通衢的美称&#xff0c;地处长江中游&#xff0c;富有荆楚之美誉&#xff0c;灵秀之蕴意。2022年湖北数字经济强省三年行动计划正式印发&#xff0c;计划到“十四五”末&#xff0c;数字经济核心产业增加值力争达到7000亿元&#xff0c;占GDP的比重超过12%。…

为什么说数字化转型是趋势?企业进行数字化转型应关注哪些层面?

都说数字化转型是个趋势&#xff0c;那么数字化转型的趋势究竟从何而来&#xff1f; 今天这篇文章就借此来深入探讨一下&#xff1a;为什么说数字化转型是趋势&#xff0c;以及企业数字化转型需要关注哪几个层面。 一、为什么说数字化转型是趋势&#xff1f; 1、数字转型迷茫…

祝贺!我的同事丁宇获“2023 年度云原生产业领军人物”荣誉称号

云布道师 日前&#xff0c;在云原生产业大会上&#xff0c; 中国信息通信研究院授予我的同事丁宇 “2023 年度云原生产业领军人物”荣誉称号&#xff0c; 以表彰其在云原生产业上的突出贡献与创新引领。 组委会在评语中写到&#xff1a; “他开创性的打造全链路压测技术&…

Python 爬虫之下载视频(三)

批量下载某B主视频 文章目录 批量下载某B主视频前言一、基本思路二、确定遍历循环结构三、基本思路中第12步三、基本思路中第345步总结 前言 上一篇讲了如何去获取标题和视频链接。这篇就跟大家讲一下如何去下载这些视频。本篇会以标题和 视频链接 为突破口&#xff0c;来寻找…

SAP系统标准表之间的关联关系对应

SAP系统标准表之间的关联关系对应

VPN理论入门及GRE、L2TP、IPsec(HCIP)

一、VPN概述 IPsec-VPN&#xff1a; 1、应用范围&#xff1a;用于分公司和总部之间。 2、作用&#xff1a;机密性、证书&#xff08;身份认证&#xff09; VPN概述 VPN概述&#xff1a;VPN&#xff08;Virtual Private Network&#xff09;是指依靠Internet服务提供商ISP&a…

jetson nano系列安装nomachine

引言&#xff1a;项目需要实现远程控制和可视化&#xff0c;在实现了4G通信的基础上&#xff0c;使用namochine实现远程的可视化和操作 1、硬件&#xff1a;jetson orin nano 8G 2、环境&#xff1a;ubuntu20.04ros-noetic 注意&#xff1a;项目主要是为了方便客户端连接到这…

Zookeeper集群搭建,四字命令监控,Leader选举原理以及数据如何同步

Java学习面试指南&#xff1a;https://javaxiaobear.cn 1、集群角色 Leader&#xff1a; 领导者。 事务请求&#xff08;写操作&#xff09;的唯一调度者和处理者&#xff0c;保证集群事务处理的顺序性&#xff1b;集群内部各个服务器的调度者。对于create、setData、delete…

集合论:二元关系(1)

集合论这一章内容很多&#xff0c;重点是二元关系中关系矩阵&#xff0c;关系图和关系性质:自反、反自反、对称、反对称、传递以及关系闭包的运算&#xff0c;等价关系&#xff0c;偏序关系&#xff0c;哈斯图&#xff0c;真吓人&#xff01; 1.笛卡儿积 由两个元素x和y按照一…

RTP/RTCP/RTSP/SIP/SDP/RTMP对比

RTP&#xff08;Real-time Transport Protocol&#xff09;是一种用于实时传输音频和视频数据的协议。它位于传输层和应用层之间&#xff0c;主要负责对媒体数据进行分包、传输和定时。 RTCP&#xff08;Real-Time Control Protocol&#xff09;是 RTP 的控制协议&#xff0c;…