组合问题-回溯算法

news2024/11/27 1:19:43

1题目

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

你可以按 任何顺序 返回答案。

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]

2链接

题目链接:77. 组合 - 力扣(LeetCode)

视频链接:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

3解题思路

第一反应找两个数的组合,两层for循环暴力求解,此题可行。

但是如果找50个数的组合,嵌套50层for循环根本不可能,时间复杂度极高,所以要用回溯算法

可以把这种问题都看成树状结构问题,如图所示:

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

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

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

引入类似递归三部曲的回溯算法三部曲

1、确定函数返回值及参数

本题可以使用全局变量来记录结果,无需函数返回值。

注意到组合的特性:无顺序。所以选取的时候不能再反向选取,我们可以通过设定一个标志位startIndex来处理

vector<vector<int>> result; // 存放符合条件结果的集合
vector<int> path; // 用来存放符合条件单一结果
void backtracking(int n, int k, int startIndex)

2、回溯的终止条件

如何终止?答:到达叶子结点(找到了目标组合)

其实也就是path的长度等于所需长度k

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

if (path.size() == k) {
    result.push_back(path);
    return;
}

3、单层回溯的过程

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

如此我们才遍历完图中的这棵树。

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(); // 回溯,撤销处理的节点
}

可以看出backtracking(递归函数)通过不断调用自己一直往深处遍历,总会遇到叶子节点,遇到了叶子节点就要返回。

注意下重点在于后面的撤销操作,这样才能起到回溯的效果

4代码

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/551477.html

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

相关文章

美国国际留学生超136万,本科、硕士和博士各占多少?

国际教育市场研究机构ICEF Monitor近日公布&#xff0c;2022年美国持有F-1和M-1有效学习签证的国际学生数量共计136.2万人&#xff0c;与2021年相比增长了10.1%。 其中&#xff0c;国际学生来美国读本科学士学位的占37%&#xff0c;读硕士学位的占41%&#xff0c;读博士学位的…

为什么WordPress这么难用?(以及如何让它变得简单点)

WordPress 是世界上最受欢迎的网站构建器&#xff0c;为互联网上超过 43% 的网站提供支持。然而&#xff0c;有些人抱怨说 WordPress 比 Squarespace 和 Wix 等解决方案更难使用。 在本文中&#xff0c;我们将解决为何WordPress这么难用的神话&#xff0c;并分享您可以用来毫无…

用于具有缺失模态的脑肿瘤分割的模态自适应特征交互

文章目录 Modality-Adaptive Feature Interaction for Brain Tumor Segmentation with Missing Modalities摘要本文方法Modality-Adaptive Feature InteractionGraph RepresentationGraph Edge ComputationModality Feature Updating 实验结果 Modality-Adaptive Feature Inter…

OpenCV入门-基于Python

图像入门 1. 创建窗口namedWindow()resizeWindow()destroyAllWindow() 2.显示图像imread()imshow()imwrite()waitKey()flip() 代码演示3.显示视频VideoCapure()对象cap.get()cap.isOpened()cap.read()cap.release() 部分功能代码演示VideoWriter()对象VideoWriter_fourcc()writ…

K8s之Pod生命周期、启动停止钩子

文章目录 一、Pod生命周期流程二、初始化容器-initContainers三、主容器操作-containers1、启动钩子-lifecycle.postStart2、停止钩子-lifecycle.preStop 一、Pod生命周期流程 Pod生命周期整个过程 如下图&#xff1a; 1、在启动任何容器之前&#xff0c;前创建 pause 容器&am…

u-boot移植:详细讲解移植u-boot.2022.10版本到imx6ull开发板

目录 一、u-boot编译环境准备 1.安装交叉编译工具链 2.u-boot源码包下载 3.编译 4.安装依赖库 二、U-Boot中添加自己的开发板 1、添加开发板默认配置文件 2、添加开发板对应的头文件 3、添加开发板对应的板级文件夹 4、修改 arch/arm/mach-imx/mx6/Kconfig 5、其他需…

5分钟使用UNI-APP框架创建你的第一个项目

UNI-APP学习系列 5分钟使用UNI-APP框架创建你的第一个项目 文章目录 UNI-APP学习系列前言uni-app框架创建项目一、HBuilderX可视化方式二、 vue-cli命令行方式 总结 前言 UNI-APP学习系列之5分钟创建自己的第一个uni-app项目。 uni-app框架创建项目 创建方式 一、HBuilderX可…

bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录

有时候打开终端的时候&#xff0c;会在第一行报错&#xff1a; bash: /opt/ros/kinetic/setup.bash: 没有那个文件或目录 bash: /opt/ros/melodic/setup.bash: 没有那个文件或目录 bash: /opt/ros/neodic/setup.bash: 没有那个文件或目录 凡是类似报错与bash有关的&#xf…

【PCIE703】XCKU060+海思视频处理器HI3531DV200-ARM的高性能综合视频图像处理平台设计资料及调试经验

板卡概述 PCIE703是我司自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台&#xff0c;该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&am…

架构-软件工程模块-2

系统分析 数据流图可能出案例题&#xff0c;状态转换图了解作用即可 用例图、类图选择题多&#xff0c;暴徒了解即可 #mermaid-svg-lGozbtkYJPEQF1eo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lGozbtkYJPEQF1e…

加密那些事

一、前言 说到加解密也许有些人会有些陌生&#xff08;仅对于初学者或其他行业的学者&#xff09;&#xff0c;先不说那些让人看到千篇一律的概念&#xff0c;就是如果两个人发信息怎样才能不被第三个人知道呢&#xff1f;是不是脑海里冒出了使用某种暗号&#xff0c;只有相互传…

每一个“大佬级别”的测试工程师,都有着怎样的成长那个路线?3分钟为你揭晓谜底!

目录 引言 1.何为软件测试工程师&#xff1f; 2.软件测试工程师的职责&#xff1f; 3.为什么要做软件测试&#xff1f; 4.软件测试的前途如何&#xff1f; 5.工具和思维谁更重要&#xff1f; 6.测试和开发相差大吗&#xff1f; 7.成为测试工程师的必备条件 8.测试的分…

虚拟机栈概述

一、概述 1.1、虚拟机栈背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功…

网络分析和机器学习

文章目录 网络分析1.Introduction to networks and graph foundations and algorithmsNetwork types (social/bio/comp), Euler/Hamilton, Graphs (matrix/adj)Breadth-first search (shortest paths), Depth-first search (conn. compnts) 2. Emergent global / local network…

PS的基础操作

1、图片放大缩小alt鼠标滚轮 2、按住空格不放&#xff0c;拖拽鼠标可以改变图片的位置 3、英文状态下按字母t&#xff0c;再点击想要查看的文字&#xff0c;就可以在菜单栏上看到所有属性&#xff08;取消选中按esc键) 4、点击它可以画选区来查看间距&#xff1b; w代表宽;h代表…

Jenkins版本升级

Jenkins版本过低的时候&#xff0c;一些插件无法升级&#xff0c;会引发一系列错误&#xff0c;这个时候我们就要升级版本了 一、下载更新包 第一种方式&#xff1a;Jenkins页面下载最新包 第二种官网上下载war包(Jenkins官网) 二、打开服务器搜索jenkins.war路径 1、如果Jenk…

CSDN 的 MD编辑器一些用法

一、点击关键语句跳转指定位置 在CSDN写文章的时候&#xff0c;写的文章过长往往会让读者很难找到自己想看的部分&#xff0c;这时候有个 跳转到指定位置功能 就非常的便利。CSDN在MD编辑器上(富文本编辑器只有一种)就提供了两种跳转到指定位置的方法&#xff1a; 一、目录转跳…

【SCADA】KingSCADA将数据插入SQLServer的方法

大家好&#xff0c;我是雷工&#xff01; 本篇通过实例&#xff0c;介绍KingSCADA3.7访问SQL Server2022数据库。 一、概述 1、创建数据库及数据表格&#xff1b; 2、配置ODBC数据源。 3、通过KingSCADA与数据库建立连接&#xff0c;将数据写入数据库对应表格。 二、创建数据…

自动化测试与手工测试?你真的了解吗?如何共存...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

代码随想录算法训练营第二十七天|39. 组合总和 40.组合总和II131.分割回文串

文章目录 39. 组合总和思路代码总结 40.组合总和II思路代码总结 131.分割回文串思路代码总结 39. 组合总和 思路 我举过例子&#xff0c;如果是一个集合来求组合的话&#xff0c;就需要startIndex&#xff0c;例如&#xff1a;77.组合 &#xff0c;216.组合总和III 。 如果是…