190.回溯算法:组合(力扣)

代码随想录 (programmercarl.com)

一、什么是回溯算法

        回溯算法是一种通用的算法设计技巧,特别适用于解决组合、排列、子集等问题。它通过逐步构建解决方案,并在发现部分解决方案无效时撤销(回溯)部分计算,从而寻找所有可能的解决方案。

        回溯算法的基本思想是通过深度优先搜索(DFS)遍历所有可能的解空间,当发现某条路径不符合条件时,返回到上一步,尝试其他路径。

二、回溯法解决的问题

回溯法,一般可以解决如下几种问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等

三、如何理解回溯法

        回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度就构成了树的深度

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

四、回溯三部曲 

  • 回溯函数模板返回值以及参数
void backtracking(参数)
  • 回溯函数终止条件
if (终止条件) {存放结果;return;
}
  • 回溯搜索的遍历过程
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果
}

完整模板如下

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

力扣题目

 

代码解决 

class Solution {
public:vector<vector<int>> result;  // 存储所有组合结果vector<int> path;  // 存储当前组合路径// 回溯函数void backtracking(int n, int k, int index) {// 如果当前路径长度等于k,则找到一个有效组合,将其加入结果集if (path.size() == k) {result.push_back(path);return;}// 从当前索引开始遍历到nfor (int i = index; i <= n; i++) {path.push_back(i);  // 选择当前数加入组合路径backtracking(n, k, i + 1);  // 递归调用,继续选择下一个数path.pop_back();  // 撤销选择,回溯到上一步}}// 主函数,生成1到n中k个数的所有组合vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);  // 从1开始进行回溯return result;  // 返回所有组合结果}
};

代码使用了回溯算法。主要思路是使用一个递归函数 backtracking 来生成所有可能的组合。在每次递归调用中,我们选择一个数并将其添加到当前组合中,然后递归地继续选择下一个数。如果当前组合的长度达到k,则将其添加到结果集中。在每次递归调用之前,我们通过将当前数从路径中移除来实现回溯。

这里简要解释一下代码的工作流程:

  1. 定义两个全局变量 result 和 path,分别用于存储所有组合结果和当前组合路径。
  2. 定义一个辅助函数 backtracking,它接受三个参数:n(数列的上限)、k(组合中元素的数量)和当前选择的起始索引 index
  3. 如果当前路径长度等于k,则找到了一个有效的组合,将其加入结果集 result
  4. 从当前索引 index 开始遍历到n,对于每个数,将其添加到路径 path 中,然后递归调用 backtracking 函数继续选择下一个数。
  5. 在每次递归调用之前,通过 path.pop_back() 撤销选择,实现回溯。
  6. 在 combine 函数中,调用 backtracking 函数开始生成所有可能的组合,并返回结果集 result

这个算法的时间复杂度是 O(n * k),因为需要生成所有可能的k个数的组合。空间复杂度也是 O(n * k),因为需要存储所有组合和递归调用的栈。

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

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

相关文章

灵活的招聘管理系统有五种方法帮助成功招聘

还记得以前的时代吗&#xff1f;这取决于你的年龄&#xff0c;直到智能手机、流媒体电视和电子邮件出现。今天&#xff0c;任何活着的成年人都经历了技术上的巨大变化&#xff0c;这创造了一种新的行为方式。人才获取也是如此。 一个值得推荐的招聘管理系统 招聘团队被困在满足…

zlib库的交叉编译记录

zlib库的交叉编译记录 嵌入式项目中要用到zlib库&#xff0c;今天下载交叉编译了一遍&#xff0c;发现和其它库有点区别&#xff0c;这里记录一下。 1.首先clone到本地 git clone https://github.com/madler/zlib.git2.建立一个安装目录 mkdir ~/zlib-arm-install3.声明一个…

C# —— 构造函数

什么是构造函数 构造函数: 一般在函数为类的属性初始值的作用&#xff0c;构造函数的名称类名 在类里面定义构造函数 方法名和类名同名 不能带返回值类型 void/非void 不能有 // 创建一个构造函数 class People {public string Name { get; set; }public int Age { get; set;…

用于制作耳机壳的UV树脂耳机壳UV胶价格高不高?

用于制作耳机壳的UV树脂耳机壳UV胶价格高不高&#xff1f; 制作耳机壳的UV树脂价格相对于一些其他材料可能会略高&#xff0c;但具体的价格取决于多个因素&#xff0c;如品牌、型号、质量等。一些高端的UV树脂品牌和型号可能会价格较高&#xff0c;但它们也通常具有更好的性能…

C语言入门3-逻辑控制

If-Else 语法 if (expression)statement1 elsestatement2Else-If 语法 if (expression1) {// 条件expression1为真时执行的语句 } else if (expression2) {// 条件expression1为假&#xff0c;且expression2为真时执行的语句 } else if (expression3) {// 条件expression1和…

nvidia历史版本驱动

打开官网 https://www.nvidia.cn windows GTX-1060为例 标准

【中学教资科目二】03中学教学

03中学教学 第一节 教学的任务1.1 教学的任务 第二节 教学过程2.1 教学过程的本质2.2 教学过程的基本规律 第三节 教学原则3.1 因材施教原则 第四节 教学方法4.1 我国中学常用的教学方法4.2 国外常用的教学方法 第五节 教学组织形式、教学工作基本环节和教学评价5.1 现代其他教…

OpenHarmony角落里的知识:WPA_Supplicant连接方式

WPA_Supplicant连接方式简析 /third_party/wpa_supplicant |-- CONTRIBUTIONS # 贡献说明 |-- COPYING # 版权说明 |-- wpa_supplicant-2.9 # 轻量级系统的wpa_supplicant | |-- hostapd # Wi-Fi热点相关功能&#xff08;Acces…

基于Web的图书管理系统运行教程

1.5、安装数据库和数据库管理工具 目前作者所有毕设源码数据库都用 MySQL5.7版本&#xff0c;强烈建议初学者跟作者保持一致&#xff0c;避免出现其他错误&#xff0c;待运行成功后再根据需要调整数据库版本。 MySQL5.7安装教程请看作者另一篇文章&#xff1a;《MySQL绿色版安…

设计模式(三)代理模式

目录 一、什么是代理模式 二、静态代理 1、定义 2、代码 2.1、接口 2.2、被代理对象 2.3、代理对象 2.4、测试 三、动态代理 1、定义 2、代码 2.1、接口 2.2、目标对象 2.3、代理对象 2.4、测试 一、什么是代理模式 代理模式(Proxy Pattern)是一种结构性模式。代理模…

MySQL_常用配置

一、忽略大小写 1.1 查看大小写配置 mysql> show variables like %lower_case_table_names%; ------------------------------- | Variable_name | Value | ------------------------------- | lower_case_table_names | 0 | ------------------------------…

【前端】[vue3] [uni-app] 组件样式击穿:deep

我是在开发uni-app时测试的思路&#xff0c;大家可以借鉴一下。 我这边测试的是uni组件&#xff0c;但是我觉得即便你用element-plus之类的&#xff0c;样式击穿的思路都相同。 我自定义了一个全局样式scss文件&#xff0c;并引入到了项目中。(如图) 利用vue3 中的 deep 方式…

为什么Transformer的编码器和解码器如此重要?一文带你读懂

Transformer 模型是一种基于自注意力&#xff08;self-attention&#xff09;机制的深度学习模型&#xff0c;最初是为了解决自然语言处理&#xff08;NLP&#xff09;中的序列到序列&#xff08;sequence-to-sequence&#xff09;任务而提出的&#xff0c;如机器翻译。Transfo…

人脸识别——可解释的人脸识别(XFR)人脸识别模型是根据什么来识别个人的

可解释性人脸识别&#xff08;XFR&#xff09;&#xff1f; 人脸识别有一个任务叫1:N&#xff08;识别&#xff09;。这个任务将一个人的照片与N张注册照片进行比较&#xff0c;找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中&#xff0c;任务从监控摄像…

【论文笔记】Parameter-Effificient Transfer Learning for NLP

题目:Parameter-Effificient Transfer Learning for NLP 阅读 文章目录 0.摘要1.引言2 Adapter tuning for NLP3 实验3.1 参数/性能平衡3.2 讨论 4.相关工作 0.摘要 克服微调训练不高效的问题&#xff0c;增加一些adapter模块&#xff0c;思想就是固定原始的网络中的参数&…

.input只读,禁用,必填,提示词(占位符)属性分别是什么?

在HTML中&#xff0c;<input>元素有几个常用的属性&#xff0c;包括只读&#xff08;readonly&#xff09;、禁用&#xff08;disabled&#xff09;、必填&#xff08;required&#xff09;和提示词&#xff08;占位符&#xff0c;placeholder&#xff09;。以下是这些属…

mysql model_path longblob 类型文件操作

在 MySQL 中&#xff0c;如果你有一个表包含一个 LONG BLOB 类型的字段&#xff08;例如 model_path&#xff09;&#xff0c;你可以使用 SQL 查询来提取该字段中的二进制数据&#xff0c;并将其下载为文件。以下是一个完整的步骤来实现这个过程&#xff1a; 步骤1&#xff1a;…

开源低代码平台,JeecgBoot v3.7.0 里程碑版本发布

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

90V转12V1A恒压WT6039

90V转12V1A恒压WT6039 WT6039降压DC-DC转换器芯片专为处理宽泛的电压输入范围设计&#xff0c;支持从12V至90V。该芯片集成了关键功能&#xff0c;如使能控制开关、参考电源、误差放大器、过热保护、限流保护及短路保护等&#xff0c;以确保系统在各种操作条件下的安全与稳定性…

qt开发-05_QPushButton

按钮是最常用的控件&#xff1b; 如果找不到文件可以这样&#xff1a; 选择这个复制文件的路径&#xff0c;粘贴就可以了。 在qt中新建一个项目&#xff0c;并且打开ui界面添加一个按钮&#xff1b; 右键这个按钮可以有很多功能&#xff1a; 先是这个转到槽&#xff0c;这个就…