Leetcode算法训练日记 | day25

一、组合总和Ⅲ

1.题目

Leetcode:第 216 题

找出所有相加之和为 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.解题思路

使用回溯算法来解决组合求和问题。backtracking 函数是一个递归函数,它尝试将每个可能的数字添加到当前路径中,并递归地继续添加下一个数字,直到路径长度达到 k 或者当前和超过目标和。每次递归调用时,都会检查当前路径长度是否满足条件以及当前和是否等于目标和,
如果满足,则将其添加到结果中。combinationSum3 函数是公共接口,它初始化结果和路径,然后开始递归过程。

3.实现代码

#include <iostream>
#include <vector>
using namespace std;// 一、组合总和Ⅲ
class Solution1 {
public:vector<vector<int>> result; // 用于存储所有可能组合的结果vector<int> path; // 用于存储当前组合的路径// 递归函数,用于生成所有可能的组合void backtracking(int targetSum, int k, int sum, int starIndex) {if (path.size() == k) { // 如果当前路径长度等于 k,表示找到了一个候选组合if (sum == targetSum) // 如果当前组合的和等于目标和result.push_back(path); // 将当前路径添加到结果中return; // 递归返回,不再继续扩展当前路径}// 遍历从starIndex开始的数字,直到9,因为候选数字集是1到9for (int i = starIndex; i <= 9; i++) {sum += i; // 将当前数字添加到组合的当前和中path.push_back(i); // 将当前数字添加到路径中backtracking(targetSum, k, sum, i + 1);// 递归调用backtracking函数,尝试添加下一个数字sum -= i; // 回溯path.pop_back();// 回溯,移除最后一个数字,尝试其他可能的数字}}// 成员函数,用于初始化并开始组合生成过程vector<vector<int>> combinationSum3(int n, int k) {result.clear(); // 清空之前的组合结果path.clear(); // 清空当前路径backtracking(n, k, 0, 1); // 调用递归函数,从数字1开始生成组合return result; // 返回所有可能的组合结果}
};// 二、组合总和Ⅲ(剪枝优化)
class Solution2 {
public:vector<vector<int>> result; // 用于存放所有满足条件的组合结果vector<int> path; // 用于记录当前的组合路径// 辅助函数,实现回溯算法的递归过程void backtracking(int targetSum, int k, int sum, int startIndex) {if (sum > targetSum) { // 如果当前和已经超过目标和,直接返回,进行剪枝return;}if (path.size() == k) { // 如果当前组合的长度等于 kif (sum == targetSum) { // 如果当前组合的和等于目标和,将其添加到结果集中result.push_back(path);}return; // 如果当前组合的和不等于目标和,直接返回,不进行后续递归}// 从startIndex开始,尝试所有可能的数字,直到不能再选择更多的数字for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {sum += i; // 将当前数字加入到当前和中path.push_back(i); // 将当前数字加入到当前组合路径中backtracking(targetSum, k, sum, i + 1); // 递归调用,继续尝试下一个数字sum -= i; // 回溯,从当前和中移除最后一个数字path.pop_back(); // 回溯,从当前组合路径中移除最后一个数字}}// 成员函数,提供组合求和问题的解法vector<vector<int>> combinationSum3(int n, int k) {result.clear(); // 清空之前存储的结果集,为新的计算做准备path.clear(); // 清空当前的组合路径backtracking(n, k, 0, 1); // 调用回溯函数,从数字1开始尝试组合return result; // 返回所有满足条件的组合结果}
};//测试
int main()
{Solution1 s;vector<vector<int>> result;int n, k;cout << "n = ";cin >> n;cout << "k = ";cin >> k;result =s.combinationSum3(n, k);cout << "所有的组合有:" << endl;for (int i = 0; i < result.size(); i++) {for (int j = 0; j < k; j++) {cout << result[i][j] << "  ";}cout << endl;}cout << endl;return 0;
}

ps:以上皆是本人在探索算法旅途中的浅薄见解,诚挚地希望得到各位的宝贵意见与悉心指导,若有不足或谬误之处,还请多多指教。 

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

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

相关文章

2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 D题 航空安全风险分析和飞行技术评估问题 原题再现 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21”空难的发生…

[CSS]使用方式+样式属性

层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;与HTML一样&#xff0c;也是一种标记语言&#xff0c;其作用就是给HTML页面标签添加各种样式&#xff0c;定义网页的显示效果&#xff0c;将网页内容和显示样式进行分离&#xff0c;提高了显示功能。简单…

Jenkins使用-绑定域控与用户授权

一、Jenkins安装完成后&#xff0c;企业中使用&#xff0c;首先需要绑定域控以方便管理。 操作方法&#xff1a; 1、备份配置文件&#xff0c;防止域控绑定错误或授权策略选择不对&#xff0c;造成没办法登录&#xff0c;或登录后没有权限操作。 [roottest jenkins]# mkdir ba…

libftdi1学习笔记 1 - 打开/关闭设备

目录 1. 获取版本信息 2. 创建上下文对象 3. 查找FTDI设备 4. 获取字符串描述符 5. 指定接口 6. 打开设备 6.1 指定VID/PID的方式 6.2 指定描述符的方式 6.3 指定描述符和设备索引的方式 6.4 其他方式 7. 关闭设备 libftdi1是一个升级版本的库&#xff08;旧的版本是…

K8s 命令行工具

文章目录 K8s 命令行工具kubectl 工具在任意节点使用kubectl方式创建对象命令显示和查找资源更新资源修补资源编辑资源Scale 资源删除资源查看pod信息节点相关操作 K8s 命令行工具 在搭建集群的时候&#xff0c;我们通过yum 下载了kubeadm kubelet kubectl 三个命令行工具&…

华为云配置安全组策略开放端口

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

这家动画公司,女神表情灵动秒杀90%的国漫女角色!

当3D国漫市场逐渐加入“内卷”的行列&#xff0c;从大的底层创作引擎UE的运用迭代&#xff0c;到细节的人物动捕、面捕技术的实际结合&#xff0c;在这场内卷的百舸争流中&#xff0c;涌现出一家家风格各异的头部国漫制作公司&#xff1a;有整体偏写实风格的原力动画&#xff0…

乌龟棋(c++实现)

题目 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘只有一行&#xff0c;该行有 N个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。 棋盘第 1 格是唯一的起点&#xff0c;第 N 格是终点&#xff0c;游戏要求玩家控制一个…

多媒体互动装置如何助力智慧城市展厅的信息化建设?

随着现代化科技技术的发展&#xff0c;智慧城市的建设概念与实施也日益成熟&#xff0c;其中智慧城市展厅便是用于展示智慧城市理念、技术和规划的重要平台&#xff0c;而应用在其中的多媒体互动装置&#xff0c;更是起着重要的作用&#xff0c;它们能够让观众更直观地了解和体…

天空盒1-天空盒的实现原理

天空盒是一种常用的实时渲染技术&#xff0c;用于在三维场景中模拟远处环境&#xff0c;例如天空、山脉或城市等。它通过将一个立方体贴图&#xff08;也称为环境贴图&#xff09;投影到场景的背景中&#xff0c;给人一种无限远的感觉。以下是天空盒的实现原理&#xff1a; 创建…

对策略设计模式的一个小扩展

在基于产品的二次开发过程中&#xff0c;有时需要对产品项目中预制的某一个策略实现作些修改。但又不想修改策略的路由信息。以免调用方需要更新参数或修改代码等。基于此&#xff0c;对产品的策略接口作了一个小扩展&#xff0c;加上了一个可替换相同策略的boolean函数。效果还…

统一登陆实现简化流程

比如,前端使用vue,后端使用abp框架 则首先需要一个统一的中央认证服务,来给每个后端服务通信以验证用户凭据,并返回访问令牌, 中央认证服务保存各自后端的令牌,后端服务使用JWT或其他机制验证令牌的有效性。 1、前端登录请求中央认证服务,返回认证服务自己的令牌 2、…

AI识别技术详解 --在windows环境中部署基于YOLO v8模型的目标检测

首先 YOLO是一个端到端的目标检测算法&#xff0c;一次前向传播计算&#xff0c;实现图像的多目标检测任务&#xff0c;我么可以在ultralytics官网上查看YOLO的各个版本&#xff08;v1-v8&#xff09;以及源码 使用YOLO v8提供的python接口&#xff0c;训练一个佩戴安全帽的目标…

解释Python中的并发和并行编程

解释Python中的并发和并行编程 在Python编程中&#xff0c;并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;是两个经常被提及的概念&#xff0c;它们都与程序的执行方式有关&#xff0c;但各自有着不同的含义和应用场景。下面我们将详细解…

无人机空气动力学

在现代科技的飞速发展中&#xff0c;无人机已经成为了备受关注的热门话题。它们能够在天空中自由翱翔&#xff0c;执行各种复杂的任务&#xff0c;这一切都离不开空气动力学的奇妙原理。本文将深入剖析无人机的空气动力学&#xff0c;带您领略无人机在空中飞行的神秘世界。 引…

关于Unity使用DLL的说法

最近在研究一些构建依赖相关的&#xff0c;特别是Unity在不同平台上使用第三方类库时候的问题。简单查了一下资料&#xff0c;其实不难理解&#xff0c;这里只是简单的记录一下&#xff0c;弄明白一个简单的道理就行了。 为什么有的第三方库(DoTween),NewtonSoft等的dll库&…

数组算法——查询位置

需求 思路 使用二分查找找到第一个值&#xff0c;以第一个值作为界限&#xff0c;分为左右两个区间在左右两个区间分别使用二分查找找左边的7,&#xff1a;找到中间位置的7之后&#xff0c;将中间位置的7作为结束位置&#xff0c;依次循环查找&#xff0c;知道start>end,返回…

c++运算符重载详细笔记,有关重载的最常用的用法

在类中重新定义运算符&#xff0c;赋予它新的 只能在类中使用的类运算&#xff0c;称之为运算符重载。 c加入了运算符重载&#xff1a;而实际上我们在不知不觉的情况下就已经在使用运算符重载了。就比如我们经常使用的string类&#xff0c;c在string内部进行了运算符重载&…

uniapp小程序中使用video视频播放卡顿

问题:在使用uniapp小程序的video视频播放,视频已经在播放了,但是进度条没走,还是卡顿的状态(测试ios能正常使用,安卓手机会出现此问题) 在网上找了很多方法,最多的说是用:custom-cache"false",试了并没有效果,看来和我问题不一样,后来用了个简单粗暴的方法,发现是有效…

超标量处理器设计:两位饱和计数器基于局部历史的分支预测

★ 继续学习体系结构的知识。 1. 什么是分支预测 程序中有一种叫做分支指令的指令&#xff0c;如果在取指令阶段就可以预知本周期所取指令中是否存在分支指令&#xff0c;并且知道其方向&#xff08;跳转/不跳转&#xff09;以及目标地址&#xff0c;就可以从在下个周期从分支…