LeetCode【0039】组合总和
本文目录
- 1 中文题目
- 2 求解方法:回溯法
- 2.1 方法思路
- 2.2 Python代码
- 2.3 复杂度分析
- 3 题目总结
1 中文题目
给定一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例:
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
输入: candidates = [2], target = 1
输出: []
提示:
- 1 ≤ c a n d i d a t e s . l e n g t h ≤ 30 1 \leq candidates.length \leq 30 1≤candidates.length≤30
- 2 ≤ c a n d i d a t e s [ i ] ≤ 40 2 \leq candidates[i] \leq 40 2≤candidates[i]≤40
- c a n d i d a t e s candidates candidates 的所有元素
互不相同 - 1 ≤ t a r g e t ≤ 40 1 \leq target \leq 40 1≤target≤40
2 求解方法:回溯法
2.1 方法思路
方法核心
- 使用回溯算法解决组合问题
- 通过排序和剪枝优化搜索效率
- 维护当前路径和起始位置
实现步骤
(1)预处理:
- 对候选数组进行排序
- 初始化结果列表
(2)回溯过程:
- 记录当前路径和剩余目标值
- 从指定位置开始搜索
- 进行剪枝优化
- 维护搜索状态
(3)状态管理:
- 添加当前数字到路径
- 递归搜索剩余目标
- 回溯删除当前数字
- 继续搜索其他可能
方法示例
输入示例:candidates = [2,3,6,7], target = 7执行过程:1. 首先排序(本例已排序)
2. 开始回溯搜索:第一层递归:从2开始
- 选择2:[2], target=5第二层递归:- 选择2:[2,2], target=3第三层递归:- 选择2:[2,2,2], target=1- 回溯到[2,2]- 选择3:[2,2,3], target=0 (找到解)- 回溯到[2,2]- 回溯到[2]- 选择3:[2,3], target=2第三层递归:- 选择2:[2,3,2], target=0 (找到解)- 回溯到[2,3]- 回溯到[2]
- 回溯到[]
- 选择3:[3], target=4... (类似过程)
- 选择6:[6], target=1- 剪枝(1<6)
- 选择7:[7], target=0 (找到解)最终结果:[[2,2,3], [2,3,2], [7]]
2.2 Python代码
class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:# 对候选数组进行排序,便于剪枝candidates.sort()# 存储所有符合条件的组合result = []def backtrack(target: int, temp_list: List[int], start: int) -> None:"""回溯函数target: 当前还需要的和temp_list: 当前已选择的数字列表start: 本次搜索的起始位置"""# 如果目标值为0,说明当前组合符合要求if target == 0:result.append(temp_list[:])return# 从start开始遍历候选数组for i in range(start, len(candidates)):# 剪枝:如果当前数字已经大于目标值,后面的数字更大,直接breakif candidates[i] > target:break# 将当前数字加入临时列表temp_list.append(candidates[i])# 递归调用,注意target减去当前数字,start保持在i(因为可以重复使用)backtrack(target - candidates[i], temp_list, i)# 回溯,移除最后加入的数字temp_list.pop()# 从0开始回溯搜索backtrack(target, [], 0)return result
2.3 复杂度分析
- 时间复杂度: O ( N T / M ) O(N^{T/M}) O(NT/M),N是candidates数组的长度,T是目标值target,M是candidates中的最小值
- 实际复杂度因剪枝而降低
- 空间复杂度: O ( T / M ) O(T/M) O(T/M)
- 递归调用栈的深度
3 题目总结
题目难度:中等
数据结构:数组
应用算法:回溯
相关文章:
LeetCode【0039】组合总和
本文目录 1 中文题目2 求解方法:回溯法2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#…...
AscendC从入门到精通系列(一)初步感知AscendC
1 什么是AscendC Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C标准规范,兼具开发效率和运行性能。基于Ascend C编写的算子程序,通过编译器编译和运行时调度,运行在昇腾AI处理器上。使用Ascend C,开发者…...
PostgreSQL中的COPY命令:高效数据导入与导出
在PostgreSQL数据库中,数据导入和导出是日常工作中常见的操作。传统的插入(INSERT)方法虽然可以实现数据的导入,但在处理大量数据时效率较低。而COPY命令则提供了一个快速、高效的方式来完成这一任务。COPY命令不仅可以用于将数据…...
【HAL库】STM32F105VCTx多通道ADC+DMA方式的【STM32CubeMX】配置及代码实现
相关代码编写 配置好后点击生成代码,在生成代码的adc.c文件中的初始化函数MX_ADC1_Init中添加如下代码: HAL_ADCEx_Calibration_Start(&hadc1); /* 校准ADC */HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value,ADC_DMA_…...
[SaaS] 数禾科技 AIGC生成营销素材
https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935...
vue3中查找字典列表中某个元素的值对应的列表索引值
vue3中查找字典列表中某个元素的值对应的列表索引值 目录思路方法代码实现示例解释说明 目录 思路方法 要获取字典列表中某个元素的值对应的列表索引值,可以使用数组的 findIndex 方法。这个方法返回数组中满足提供的测试函数的第一个元素的索引。如果没有找到&am…...
爱普生机器人EPSON RC
爱普生机器人Epson RC系列,搭配其专用的Epson RC编程语言和软件环境,为用户提供了一个直观且功能强大的机器人控制和编程解决方案。以下是对Epson RC及爱普生机器人的一些详细介绍: Epson RC 定义:Epson RC 是爱普生机器人技术中…...
Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)
1.Linux的背景介绍 Linux 操作系统的发展历程充满了激情与创新喵~🎀 萌芽期 (1983 - 1991):Linux 的历史可追溯到 1983 年,理查德斯托曼 (Richard Stallman) 发起 GNU 计划,目标是创建一个自由软件操作系统。1987 年发…...
❤React-JSX语法认识和使用
1、JSX基本使用 JSX是React的核心 JSX是ES的扩展 jsx语法 -> 普通的JavaScript代码 -> babel React可以使用JSX的前提和原因: React生态系统支持: 脚手架通常用于构建React应用程序,而JSX是React框架的核心语法之一。因此…...
51单片机应用开发(进阶)---定时器应用(电子时钟)
实现目标 1、巩固定时器的配置流程; 2、掌握按键、数码管与定时器配合使用; 3、功能1:(1)简单显示时间。显示格式:88-88-88(时-分-秒) 4、功能2:(1&#…...
JavaScript中的对象-栈内存和堆内存以及this指向的两种情况(后续会出进阶)
1.1 栈内存和堆内存 我们知道程序是需要加载到内存中来执行的,我们可以将内存划分为两个区域:栈内存和堆内存 原始类型占据的空间是在栈内存中分配的对象类型占据的空间是在堆内存中分配的 1.1.1 值类型和引用类型 原始类型的保存方式:在变量中保存的是…...
shell脚本使用curl上传FTP
背景:要求使用curl通过shell脚本实现上传文件到FTP的功能,同时对远程目录不存在的时候,主动创建目录并上传文件,shell脚本如下: #!/bin/bash# FTP服务器的地址 FTP_SERVER"ftp://1.1.1.1:2121" # FTP用户名…...
【漏洞分析】Fastjson最新版本RCE漏洞
01漏洞编号 CVE-2022-25845CNVD-2022-40233CNNVD-202206-1037二、Fastjson知多少 万恶之源AutoType Fastjson的主要功能是将Java Bean序列化为JSON字符串,这样得到的字符串就可以通过数据库等方式进行持久化了。 但是,Fastjson在序列化及反序列化的过…...
【项目开发 | 跨域认证】JSON Web Token(JWT)
未经许可,不得转载。 文章目录 JWT设计背景:跨域认证JWT 原理JWT 结构JWT 使用方式注意JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理、结构及用法。 JWT设计背景:跨域认证 互联网服务的用户认证流程是现代应用中的核心组成部分,通常的流程…...
杨中科 .Net Core 笔记 DI 依赖注入2
ServiceCollection services new ServiceCollection();//定义一个承放服务的集合 services.AddScoped<iGetRole, GetRole>();using (ServiceProvider serviceProvider services.BuildServiceProvider()) {var list serviceProvider.GetServices(typeof(iGetRole));//获…...
微信版产品目录如何制作?
微信作为我国最流行的社交媒体平台,拥有庞大的用户群体。许多企业都希望通过微信来推广自己的产品,提高品牌知名度。制作一份精美、实用的微信版产品目录,是企业微信营销的重要手段。微信版产品目录的制作方法,帮助您轻松入门。 …...
使用HTML、CSS和JavaScript创建动态圣诞树
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏:…...
机器学习-35-提取时间序列信号的特征
文章目录 1 特征提取方法1.1 特征提取过程1.2 两类特征提取方法2 基于数据驱动的方法2.1 领域特定特征提取2.2 基于频率的特征提取2.2.1 模拟信号2.2.2 傅里叶变换2.2.3 抽取最大幅值对应特征2.2.4 抽取峰值幅值对应特征2.3 基于统计的特征提取2.4 基于时间的特征提取3 参考附录…...
【软件测试】设计测试用例的万能公式
文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包…...
【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)
目录 1. 什么是事务?2. 事务的版本支持3. 事务提交的方式3.1 事务提交方式的分类3.2 演示的准备的工作3.2.1 创建表3.2.2 MySQL的服务端和客户端3.2.3 调低事务的隔离级别 4. 手动提交4.1 手动提交的命令说明4.2 示例一4.3 示例二4.4 示例三4.5 示例四 5. 自动提交5…...
SAM 3在内容创作中的应用:快速分离图片视频主体,提升剪辑效率
SAM 3在内容创作中的应用:快速分离图片视频主体,提升剪辑效率 1. 引言:内容创作者的痛点与解决方案 在当今内容爆炸的时代,视频创作者和设计师们面临着一个共同的挑战:如何高效地从复杂背景中分离出主体对象。传统方…...
DeepSeek-V3.2量化新标杆:w8a8精度突破86%!
DeepSeek-V3.2量化新标杆:w8a8精度突破86%! 【免费下载链接】DeepSeek-V3.2-w8a8-mtp-QuaRot 项目地址: https://ai.gitcode.com/Eco-Tech/DeepSeek-V3.2-w8a8-mtp-QuaRot 导语:DeepSeek-V3.2推出w8a8量化版本,采用创新Qu…...
DanKoe 视频笔记:创作者指南:如何摆脱新手地狱
在本教程中,我们将学习创作者如何突破最初的停滞期,即所谓的“新手地狱”。我们将探讨导致这一困境的核心原因,并提供一系列具体、可操作的策略,帮助你建立权威、创作吸引人的内容、有效建立网络,并最终构建可持续的个…...
STM32F407实战:基于CubeMX与FreeRTOS的SDIO-FatFs文件系统高效读写方案
1. 环境准备与CubeMX基础配置 第一次接触STM32F407的SD卡存储时,我被各种专业术语搞得晕头转向。后来发现,只要用对工具和方法,实现文件系统读写其实没那么复杂。CubeMX这个图形化配置工具真是开发者的福音,它能帮我们自动生成80%…...
为什么头部AI工厂已全面切换PyTorch 3.0静态图训练?揭秘2024年Q2实测吞吐提升3.8倍、成本下降41%的关键配置
第一章:PyTorch 3.0静态图训练的企业级演进全景PyTorch 3.0标志着深度学习框架从动态优先范式向动静统一架构的关键跃迁。其核心突破在于TorchDynamo Inductor后端的深度融合,使torch.compile()不再仅是实验性优化器,而成为企业级生产训练流…...
手把手教你用Simulink和Carsim 2019搭建车辆动力学模型(附二自由度模型源码)
从零构建车辆动力学联合仿真模型:Simulink与Carsim 2019实战指南 当你第一次打开Carsim和Simulink时,面对两个庞大软件的无缝对接需求,很容易陷入"从哪开始"的困惑。本文将带你一步步搭建完整的车辆动力学仿真环境,从软…...
微信小程序数据绑定与渲染全解析:从入门到精通
微信小程序数据绑定与渲染实战指南:解锁高效开发密码 微信小程序开发中,数据绑定与渲染机制是构建动态界面的核心。不同于传统网页开发,小程序采用独特的双线程架构,数据通信需要特殊处理。本文将深入剖析数据绑定的底层原理&…...
别再为PDF表格头疼了!用Nougat+LangChain搞定RAG系统里的表格问答(附完整代码)
突破PDF表格解析瓶颈:Nougat与LangChain构建智能问答系统实战 每次打开满是表格的学术论文PDF时,你是否也经历过这样的挫败感?传统OCR工具要么把跨页表格拆得七零八落,要么将复杂的LaTeX公式识别成乱码,更别提准确关联…...
【实战指南】腾讯会议回放视频如何批量下载与本地永久保存?免费工具全解析
1. 为什么需要本地保存腾讯会议回放? 每次参加完重要会议或培训课程,最怕的就是回放视频突然过期。我遇到过好几次这种情况:刚想复习某个关键知识点,发现视频已经显示"已过期"。特别是当会议组织者设置了7天自动删除规则…...
CA6140车床拨叉831003加工工艺及铣左端面夹具设计【说明书+CAD图纸+SW三维】
CA6140车床拨叉831003作为机床传动系统中的关键零件,其加工质量直接影响设备运行的稳定性。该零件的加工工艺需兼顾尺寸精度与表面粗糙度要求,重点在于左端面的铣削加工。传统工艺方案多采用通用夹具定位,存在装夹效率低、重复定位精度差等问…...
