【LeetCode】216. 组合总和 III(中等)——代码随想录算法训练营Day25

题目链接:216. 组合总和 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

文章讲解:代码随想录

视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili

题解1:回溯法

思路:使用回溯法来求解组合问题。

回溯分析:

  • 递归函数的参数和返回值:首先创建3个变量 res、path 和 sum,path 记录遍历的路径,sum 记录当前路径和,res 记录结果。递归函数的返回值为 void,参数是 n 和 k,还有一个 start 来记录本次递归的开始位置。
  • 递归函数的终止条件:找到叶子节点,即 path 的长度和 k 相同,且路径和等于目标值,也就是找到了一个符合题目要求的组合,将这个组合存入结果数组。
  • 单层递归的逻辑:使用 for 循环从开始位置 start 开始直到 n 横向遍历,递归的向下纵向遍历寻找组合。
  • 剪枝:path 的长度为已选择的元素数,如果剩余的元素数小于 k - path.length,即这条路径找不到符合要求的组合了,就可以做剪枝;当路径和比目标值大时,也应该做剪枝。
/*** @param {number} k* @param {number} n* @return {number[][]}*/
var combinationSum3 = function(k, n) {if (n > k * (9 - (k - 1) + 9) / 2 || n < k * (1 + (1 + (k - 1))) / 2) {return []; // 若无符合条件的结果,直接返回空}const res = []; // 结果数组const path = []; // 路径let sum = 0; // 当前路径和// 回溯函数const backtracking = function (k, n, start) {if (path.length > k) {return; // 路径长度超过 k,直接返回}if (path.length === k) {// 路径长度为 k,符合要求则加入结果数组,然后返回sum === n && res.push([...path]);return;}for (let i = start; i <= 9 - (k - path.length) + 1; i++) { // 剪枝if (sum + i > n) {return; // 剪枝,如果路径和超过目标值,则再往下也找不出结果了,直接返回}// 记录路径path.push(i);sum += i;backtracking(k, n, i + 1); // 继续向下查找// 回溯path.pop();sum -= i;}}backtracking(k, n, 1);return res;
};

分析:时间复杂度为 O(n * 2 ^ n),空间复杂度为 O(n)。

收获

练习使用回溯法解决组合问题,根据题目内容在合适的代码位置做剪枝操作。

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

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

相关文章

浅压缩、深压缩、双引擎、计算机屏幕编码……何去何从?

专业视听领域尤其显示控制和坐席控制领域&#xff0c;最近几年最激动人心的技术&#xff0c;莫过于分布式了。 分布式从推出之日就备受关注&#xff1a;担心稳定性的&#xff0c;质疑同步性能的&#xff0c;怀疑画面质量的…… 诚然&#xff0c;我们在此前见多了带着马赛克的…

2024美赛数学建模问题D题思路模型分析——大湖水问题

问题 D: 大湖水问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊及其相连的水道构成了一个庞大的排水盆地&#xff0c;在这两个国家有许多大型城市&#xff0c;气候各异&#xff0c;局部天气条件各异。 湖泊的水被用于许多用途&#xff08;捕鱼、娱乐、发电…

【C++】类和对象1:类的定义、访问限定符、作用域及对象大小

前言 本文主要是简单的介绍一下类是什么、如何使用 类的定义 class className { // 类体&#xff1a;由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字&#xff0c;ClassName为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面…

智慧文旅:驱动文化与旅游融合发展的新动力

随着科技的快速发展和人们生活水平的提高&#xff0c;文化和旅游的融合成为了时代发展的必然趋势。智慧文旅作为这一趋势的引领者&#xff0c;通过先进的信息技术手段&#xff0c;推动文化与旅游的深度融合&#xff0c;为产业的发展注入新的活力。本文将深入探讨智慧文旅如何成…

【ASP.NET Core 基础知识】--身份验证和授权--使用Identity进行身份验证

一、Identity的基础知识 1.1 Identity的组成 在ASP.NET Core中&#xff0c;Identity是一个用于处理用户身份验证和授权的框架。它包含了一系列组件&#xff0c;用于管理用户、角色、声明等身份相关的功能。以下是ASP.NET Core Identity的主要组成部分&#xff1a; User Mana…

解决C#中无限递归导致的System.StackOverflowException异常

目录 背景&#xff1a; 错误示例分析: 为什么是错误的&#xff1f; 正确的使用递归&#xff1a; 修改后的代码&#xff1a; 原理和原因&#xff1a; 结论&#xff1a; 背景&#xff1a; 在软件开发中&#xff0c;递归是一种常见的编程技术&#xff0c;它允许方法调用自…

动态数码管实验

数码管动态显示原理 动态显示的特点是将所有数码管的段选线并联在一起&#xff0c;由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选&#xff0c;利用发光管的余辉和人眼视觉暂留作用&#xff0c;使人…

signalR+websocket:实现消息实时通讯——技能提升

signalR 解决步骤1&#xff1a;npm install microsoft/signalr6.0.6 安装指定版本的microsoft/signalr&#xff0c;我这边安装的版本是6.0.6 解决步骤2&#xff1a;引入import * as signalR from microsoft/signalr; import * as signalR from microsoft/signalr; 下面第三…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏9(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言回收物品素材绘制UI代码控制垃圾桶回收功能效果 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将…

低成本高效益,电子画册才是品牌的重要选择

​随着互联网的普及和数字化技术的进步&#xff0c;电子画册已成为许多品牌的重要选择。与传统印刷画册相比&#xff0c;电子画册具有低成本、高效益的优点&#xff0c;成为品牌宣传的新趋势。 具体来说&#xff0c;电子画册可以通过在线平台或移动设备轻松查看&#xff0c;无需…

【Spring连载】使用Spring Data访问Redis(五)----Redis Cache

【Spring连载】使用Spring Data访问Redis&#xff08;五&#xff09;----Redis Cache 一、Redis Cache 过期1.1 Time-To-Live (TTL) 过期1.2 Time-To-Idle (TTI) 过期 Spring Data Redis在org.springframework.data.redis.cache包中提供了Spring框架缓存抽象&#xff08;Cache …

logback自定义生成DB日志(java环境)

目的&#xff1a; 未来在生成日志写入数据库中加一个特殊的字段&#xff0c;官方老版本提供的DBAppender无法实现&#xff0c;并且好巧不巧&#xff0c;在新版本这个实现也被删除了&#xff0c;所以重写一个实现。 1. 安装依赖 安装logback maven依赖 注意&#xff1a; lo…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

[高阶·产品经理]业务建模和需求高阶2月26-3月1日晚8点

等级 高阶 介绍 软件开发中&#xff0c;需求是解决“系统怎样好卖”的问题&#xff0c;设计是解决“降低开发成本”的问题。 本训练聚焦第一个方面&#xff0c;在点上强化业务建模和需求的技能。每期的教材都会根据当期学员所整理的学习《软件方法》的过程中以及工作中碰到的…

SELinux,android自启动自定义程序

rc文件仿照代码&#xff1a; service test_que /vendor/bin/test_que user root group system oneshot seclabel u:r:test_que:s0 on boot start test_que Android.bp文件仿照&#xff1a; init_rc: ["test_que.rc"], product.package.mk文件…

conda虚拟环境基础

【一文搞定最新版Anaconda】Win11 安装 Anaconda&#xff08;2023.9&#xff09;详解&#xff08;不删除旧版情况下下载、安装、注册、登录、设置环境变量、迁移旧环境、配置修改换源等&#xff09;连接Pycharm_win11安装anaconda-CSDN博客 conda命令大全&#xff08;create/in…

产品经理必备知识——API接口(获取电商商品订单数据API)

前言 在古代&#xff0c;我们的传输信息的方式有很多&#xff0c;比如写信、飞鸽传书&#xff0c;以及在战争中使用的烽烟&#xff0c;才有了著名的烽火戏诸侯&#xff0c;但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代&#xff0c;我通过…

网络安全之漏洞扫描

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用&#xff0c;从而对一个组织的资产或运行造成不利影响&#xff0c;如信息系统被攻击或控制…

github上传代码遇到的问题

今晚跟着这一篇文章在GitHub上测试上传项目。《怎样在GitHub上传自己的项目》 在最后一步 git push -u origin master 遇到了问题 warning: redirecting to https://github. com/xxx/test.git/ error: RPC failed;cur1 28 Recv failure: Connection was reset send-pack: unex…

关于node.js奇数版本不稳定 将11.x.x升级至16.x.x不成功的一系列问题(一)

据说vue2用16稳定一些 vue3用18好一点&#xff08;但之前我vue3用的16.18.1也可以&#xff09; 为维护之前的老项目 先搞定node版本切换 下载nvm node版本管理工具 https://github.com/coreybutler/nvm-windows/releases 用这个nvm-setup.zip安装包 安之前最好先将之前的nod…