当前位置: 首页 > news >正文

回溯算法练习题(2024/6/10)

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]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

思路:

回溯法三部曲

  1. 递归函数的返回值以及参数:

    • 返回值:无,使用类成员变量result存储最终结果。
    • 参数:backtracking函数接受三个参数,分别是n(1到n的范围)、k(组合的长度)、startIndex(当前处理的起始位置)。
  2. 回溯函数终止条件:

    • 当path的长度等于k时,将当前path加入结果集,然后返回。
  3. 单层搜索的过程解题思路:

    • 从startIndex到n的范围内遍历所有可能的数字。
    • 将当前处理的数字i添加到path中,表示选择了这个数字。
    • 进行递归调用backtracking函数,继续向下搜索,但是startIndex更新为i+1,表示下一次搜索时不再考虑当前数字i之前的数字。
    • 当递归返回后,将当前处理的数字i从path中弹出,进行回溯操作,尝试其他可能的组合。
    • 通过不断选择、判断和回溯操作,搜索所有符合条件的组合,最终将结果存储在result中并返回。

代码:

class Solution {
private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, int startIndex) {if (path.size() == k) { // 如果路径长度等于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) {backtracking(n, k, 1); // 从1开始尝试组合return result; // 返回结果集}
};

2 组合总和 III

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:

  • 2 <= k <= 9
  • 1 <= n <= 60

思路:

  1. 递归函数的返回值和参数:

    • 返回值:无,结果保存在类成员变量result中。
    • 参数:backtracking函数接受四个参数,分别是目标和targetSum、组合的长度k、当前组合的和sum、当前可以选数字的最小索引startIndex。
  2. 回溯函数的终止条件:

    • 如果当前的和sum超过了目标和targetSum,则不再搜索直接返回。
    • 如果当前组合的长度path等于k,且当前的和sum等于目标和targetSum,则将当前组合加入结果集合result。
  3. 单层搜索的过程解题思路:

    • 从startIndex开始,遍历所有可选的数字。
    • 将当前数字i加入组合path中,累加当前和sum。
    • 递归调用backtracking函数,继续搜索下一个数字。
    • 递归返回后,从当前和sum中减去当前数字i,从组合path中移除当前数字i。
    • 通过不断的加入数字、递归搜索和移除数字,最终得到所有满足条件的组合。

代码:

class Solution {
private:vector<vector<int>> result; // 存放结果集合vector<int> path; // 用来存放当前组合// 回溯函数,生成和为 targetSum,长度为 k 的数字组合void backtracking(int targetSum, int k, int sum, int startIndex) {// 如果当前的sum已经超过了目标值,则不再搜索直接返回if (sum > targetSum) return;// 达到组合长度要求且总和等于目标值时,将当前组合加入结果集合if (path.size() == k) {if (sum == targetSum) result.push_back(path);return;}// 从 startIndex 开始遍历可选数字for (int i = startIndex; i <= 9; i++) {sum += i; // 统计当前总和path.push_back(i); // 将当前数字加入组合中backtracking(targetSum, k, sum, i + 1); // 递归处理下一个数字sum -= i; // 回溯,撤销当前数字的处理path.pop_back(); // 回溯,撤销当前数字的处理}}public:// 组合函数,生成和为 n,长度为 k 的数字组合vector<vector<int>> combinationSum3(int k, int n) {backtracking(n, k, 0, 1); // 回溯搜索组合return result; // 返回结果集合}
};

3组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1
输出: []

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40

思路:

  1. 递归函数的返回值和参数:

    • 返回值:无,结果保存在类成员变量result中。
    • 参数:backtracking函数接受四个参数,分别是候选数字数组candidates、目标和target、当前组合的和sum、当前可以选数字的最小索引startIndex。
  2. 回溯函数的终止条件:

    • 如果当前的和sum超过了目标和target,则不再搜索直接返回。
    • 如果当前组合的和sum等于目标和target,则将当前组合加入结果集合result。
  3. 单层搜索的过程解题思路:

    • 从startIndex开始,遍历候选数字数组candidates。
    • 将当前数字加入组合path中,累加当前和sum。
    • 递归调用backtracking函数,继续搜索当前数字。
    • 递归返回后,从当前和sum中减去当前数字,从组合path中移除当前数字。
    • 通过不断的加入数字、递归搜索和移除数字,最终得到所有满足条件的组合。

代码:

class Solution {
private:vector<vector<int>> result; // 存放结果集合vector<int> path; // 用来存放当前组合void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return; // 当前组合和超过目标值,终止搜索}if (sum == target) {result.push_back(path); // 当前组合和等于目标值,加入结果集合return;}for (int i = startIndex; i < candidates.size(); i++) {sum += candidates[i]; // 统计当前总和path.push_back(candidates[i]); // 将当前数字加入组合中backtracking(candidates, target, sum, i); // 递归处理当前数字sum -= candidates[i]; // 回溯,撤销当前数字的处理path.pop_back(); // 回溯,撤销当前数字的处理}}public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtracking(candidates, target, 0, 0); // 回溯搜索组合return result; // 返回结果集合}
};

相关文章:

回溯算法练习题(2024/6/10)

1组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a;n …...

机器学习--线性模型和非线性模型的区别?哪些模型是线性模型,哪些模型是非线性模型?

文章目录 引言线性模型和非线性模型的区别线性模型非线性模型 总结线性模型非线性模型 引言 在机器学习和统计学领域&#xff0c;模型的选择直接影响到预测的准确性和计算的效率。根据输入特征与输出变量之间关系的复杂程度&#xff0c;模型可以分为线性模型和非线性模型。线性…...

[linux] Qwen2Tokenizer报错 transformers版本问题

上午没问题&#xff0c;下午pull了新代码&#xff0c;就有了报错。。 发现是transformers版本问题。但。。其实我都默认安的是最新版本。。 也许这就是人生吧。。 报错&#xff1a; File "/Pai-Megatron-Patch/megatron_patch/tokenizer/__init__.py", line 213…...

算法刷题笔记 单链表(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a; 向链表头插入一个数&#xff1b;删除第 k个插入的数后面的一个数&#xff1b;在第 k个插入的数后插入一个数。 现在要对该链表进行M次操作&#x…...

Oracle 排查慢SQL

Oracle 排查慢SQL select * from v s q l a r e a w h e r e r o w n u m < 10 ; s e l e c t ∗ f r o m v sqlarea where rownum<10; select * from v sqlareawhererownum<10;select∗fromvsql where rownum<10; select * from dba_hist_sqltext where rownum<…...

java技术专家面试指南80问【java学习+面试宝典】(七)

Dubbo需要 Web 容器吗&#xff1f; 不需要&#xff0c;如果硬要用 Web 容器&#xff0c;只会增加复杂性&#xff0c;也浪费资源。 PrintStream、BufferedWriter、PrintWriter的比较? PrintStream类的输出功能非常强大&#xff0c;通常如果需要输出文本内容&#xff0c;都应…...

4机器学习期末复习

在机器学习中&#xff0c;数据清洗与转换包括哪些内容&#xff1f; 对数据进行初步的预处理&#xff0c;需要将其转换为一种适合机器学习模型的表示形式对许多模型类型来说&#xff0c;这种表示就是包含数值数据的向量或者矩阵&#xff1a; 1&#xff09;将类别数据编码成为对…...

chatgpt: int t[] int *t 区别

在C语言中&#xff0c;int t[]和int *t虽然在某些情况下可以相互替换&#xff0c;但它们有一些关键的区别。这些区别主要体现在声明的语义、内存分配方式和使用场景上。以下是详细的解释&#xff1a; ### 1. int t[] #### 语义: - int t[]声明了一个数组&#xff0c;t是一个数…...

网络安全技术实验六 入侵检测技术实践

一、实验目的和要求 理解基于网络的入侵检测系统的基本原理&#xff0c;掌握snort IDS工作机理&#xff1b; 学习应用snort三种方式工作&#xff1b;熟练编写snort规则&#xff1b; 完成snort数据包记录、日志查看、字符串匹配、ARP欺骗攻击检测、端口扫描工具检测等功能。 …...

SpringBoot中获取当前请求的request和response

在Spring Boot中&#xff0c;你可以以多种方式获取当前请求的HttpServletRequest和HttpServletResponse对象。以下是几种常见的写法示例&#xff1a; 1. 在方法参数中声明 最常见和推荐的方式是在控制器方法的参数中直接声明HttpServletRequest和HttpServletResponse对象。Sp…...

Neo4j 桌面版打不开踩坑贴

真的踩坑。。。没有人告诉我为啥桌面版和社区版不能一起下啊&#xff01;&#xff01; 我是先下载了社区版之后再下载的桌面版&#xff0c;结果桌面版界面一直打不开。 尝试了网上多种办法都没效果&#xff0c;好多都是说jdk不兼容导致无法打开&#xff0c;让我从JDK 17 ->…...

[数据集][目标检测]中国象棋检测数据集VOC+YOLO格式300张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;300 标注数量(xml文件个数)&#xff1a;300 标注数量(txt文件个数)&#xff1a;300 标注类别…...

全方位·多层次·智能化,漫途水库大坝安全监测方案

党的十九届五中全会提出&#xff0c;到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 加快推进小型水库除险加固。加快构建气象卫星和测雨雷达、雨量站、水文站组成…...

windows安装SQLyog

windows安装SQLyog 1. 下载 SQLyog 安装包 访问 SQLyog 的官方网站。在网站上找到下载链接&#xff0c;通常会有一个“Download”或“Try Now”按钮。如果需要注册或填写信息以获取下载链接&#xff0c;请按提示操作。 2. 运行安装程序 下载完成后&#xff0c;双击运行下载…...

jEasyUI 转换 HTML 表格为数据网格

jEasyUI 转换 HTML 表格为数据网格 jEasyUI 是一个基于 jQuery 的框架,它为用户提供了一套完整的用户界面组件,使得网页开发变得更加简单快捷。在本文中,我们将探讨如何使用 jEasyUI 将一个普通的 HTML 表格转换为功能丰富的数据网格(datagrid)。 为什么使用数据网格? …...

深度解析RocketMq源码-持久化组件(一) MappedFile

1. 绪论 rocketmq之所以能够有如此大的吞吐量&#xff0c;离不开两个组件&#xff0c;一个是利用netty实现的高性能网络通信组件&#xff1b;另一个就是利用mmap技术实现的存储组件。而在rocketmq的存储组件中主要有三个组件&#xff0c;分别是持久化文件commitLog&#xff0c…...

贝壳APP渗透测试WP

前期配置 环境说明 使用PIXEL 4手机&#xff0c;为Android 12系统 APP名为贝壳找房&#xff0c;包名com.lianjia.beike&#xff0c;版本号3.01.10&#xff0c;截至2024/05/07为最新版&#xff0c;小米应用市场下载 绕过反Frida机制 可以参考往期推送&#xff0c;《绕过最新…...

IDEA快速入门02-快速入门

二、快速入门 2.1 打开IDEA,点击New一个项目 入口&#xff0c;依次打开 File -> New -> Project。 2.2 使用Spring Initializr方式构建Spring Boot项目 2.3 设置项目所属组、项目名称、java版本等 2.4 选择SpringBoot版本及依赖组件 点击Create进行创建。 2.6 创建成…...

快速构建本地RAG聊天机器人:使用LangFlow和Ollama实现无代码开发

基于LangChain的快速RAG应用原型制作方法 还记得构建智能聊天机器人需要数月编码的日子吗&#xff1f; LangChain这样的框架确实简化了开发流程&#xff0c;但对非程序员来说&#xff0c;数百行代码仍然是一道门槛。 有没有更简单的方法呢&#xff1f; 图片由 Ravi Palwe 在…...

关于使用pycharm中控制台运行代码错误之FileNotFoundError: [Errno 2] No such file or directory:

在使用pycharm环境下复现《python编程&#xff1a;从入门到实践》这本书第16.1.1内容中分析csv文件头一节的代码时出现如下问题&#xff1a; 1、文章中使用的数据来源问题 直接参考本站Kenny C同学的文章提供内容即可。 https://github.com/kenidi8215/Hello-World 打开网页&a…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...