Hot 100 --- 组合总和
本文概览本文以LeetCode题目组合总和为例讲解回溯法在可重复选择、结果不计顺序场景下的应用以及和子集问题的对比一、题目二、题目分析题目要求给定一个无重复元素的正整数数组 candidates 和一个目标数 target找出 candidates 中所有可以使数字和为 target 的组合。同一个数字可以被无限制重复选取但结果集不能包含重复的组合[1,2] 和 [2,1] 算重复比如 candidates [2, 3, 6, 7]target 7输出[[2, 2, 3], [7]][2, 2, 3]2 被选了两次加起来 7[7]直接选一个 7这题一开始容易想到先排序用前缀和但这里行不通前缀和的前提是结果必须是原数组的连续子数组但本题的组合可以从任意位置选甚至可以重复选本题的组合可以重复选取同一个元素前缀和只能每个元素用一次所以本题的正确思路是回溯——遍历所有可能的选择路径和子集问题的对比子集组合总和每个元素能选几次最多 1 次无限次结果所有子集和 target 的组合终止条件遍历完所有元素sum target 或 sum target递归参数start下次从 start1 开始start下次从start含自己开始核心区别子集递归时传i 1不能再选自己组合总和递归时传i可以继续选自己思路概览classSolution{privatefinalListListIntegerresultnewArrayList();privatefinalListIntegerpathnewArrayList();privateintsum0;publicListListIntegercombinationSum(int[]candidates,inttarget){if(candidatesnull||candidates.length0){returnnewArrayList();}backtrack(candidates,target,0);returnresult;}privatevoidbacktrack(int[]candidates,inttarget,intstart){if(sumtarget){result.add(newArrayList(path));return;}if(sumtarget){return;}for(intistart;icandidates.length;i){path.add(candidates[i]);sumcandidates[i];backtrack(candidates,target,i);sum-candidates[i];path.removeLast();}}}思路简要说明两个终止条件sum target时收集结果sum target时剪枝返回start 参数控制只往后选避免 [2,3] 和 [3,2] 重复递归传 i 不是 i1允许重复选择当前元素三、思路详解第一步为什么不能用前缀和看到数组求和 target很多人第一反应是排序 前缀和。但仔细看题目问题一结果不是连续子数组前缀和解决的是从原数组中找一段连续的子数组但本题的组合可以从任意位置挑比如 candidates [2, 3, 6, 7] 中挑 [2, 2, 3]2 用了两次位置也不连续问题二可以重复选择前缀和的每个元素只被计算一次本题允许一个元素被选无数次前缀和天然做不到所以只能回溯——枚举所有可能的选择路径第二步为什么用 start 参数如果不控制顺序[2, 3] 和 [3, 2] 会被算成两个组合题目视为重复。解决办法是规定只往后选——每次选完一个元素后下次选择只能从当前位置开始往后以 candidates [2, 3, 6, 7]target 7 为例选 2i0后下次只能从 i0 开始含 2 自己即 {2, 3, 6, 7} 选 2i0后下次还是从 i0 开始 选 2 → sum6继续 ... 选 3i1后下次从 i1 开始含 3即 {3, 6, 7} 不能回头选 2否则会出现 [2, 3, 2] 和 [2, 2, 3] 重复这样保证每个组合的元素只按数组下标非递减顺序排列天然去重第三步递归传 i 而不是 i1这是和子集问题最大的区别// 子集每个元素最多选 1 次backtrack(res,i1,nums,subset);// 组合总和可以重复选择backtrack(candidates,target,i);传i意味着下次可以再选自己实现了元素的重复选择。以 candidates [2, 3, 6, 7]选到 2 之后第一次选 2 → path[2] 递归传 i0下次仍可以选 2 第二次选 2 → path[2, 2] 递归传 i0下次仍可以选 2 第三次选 2 → path[2, 2, 2]sum6 7 ...第四步两个终止条件if(sumtarget){result.add(newArrayList(path));return;}if(sumtarget){return;}sum target找到一个合法组合收集后返回sum target当前路径已经超出目标继续往下加只会更大直接剪枝返回因为 candidates 都是正数sum 只会越加越大所以超过就没必要继续第五步回溯操作for 循环内的四行代码是回溯的核心path.add(candidates[i]);// 选加入路径sumcandidates[i];// 选更新总和backtrack(candidates,target,i);// 往下递归sum-candidates[i];// 撤销恢复总和path.removeLast();// 撤销移除路径最后一个选就是 add sum撤销就是 sum- removeLast。每次选完往深处走回来后完整撤销for 循环 i 换下一个元素第六步完整执行过程以 candidates [2, 3, 6, 7]target 7 为例backtrack(start0, path[], sum0) ├── 选 2 → path[2], sum2 │ └── backtrack(start0) │ ├── 选 2 → path[2,2], sum4 │ │ └── backtrack(start0) │ │ ├── 选 2 → path[2,2,2], sum6 │ │ │ └── backtrack(start0) │ │ │ ├── 选 2 → sum8 7剪枝 │ │ │ ├── 选 3 → sum9 7剪枝 │ │ │ ├── 选 6 → sum12 7剪枝 │ │ │ └── 选 7 → sum13 7剪枝 │ │ ├── 选 3 → path[2,2,3], sum7 ✓ 收集 [2,2,3] │ │ ├── 选 6 → sum10 7剪枝 │ │ └── 选 7 → sum11 7剪枝 │ ├── 选 3 → path[2,3], sum5 │ │ └── backtrack(start1) │ │ ├── 选 3 → sum8 7剪枝 │ │ ├── 选 6 → sum11 7剪枝 │ │ └── 选 7 → sum12 7剪枝 │ ├── 选 6 → sum8 7剪枝 │ └── 选 7 → sum9 7剪枝 ├── 选 3 → path[3], sum3 │ └── backtrack(start1) │ ├── 选 3 → path[3,3], sum6 │ │ └── 后面都超剪枝 │ ├── 选 6 → sum9剪枝 │ └── 选 7 → sum10剪枝 ├── 选 6 → path[6], sum6 │ └── backtrack(start2) │ ├── 选 6 → sum12剪枝 │ └── 选 7 → sum13剪枝 └── 选 7 → path[7], sum7 ✓ 收集 [7]最终结果[[2, 2, 3], [7]]第七步和之前几道题的对比全排列子集方法二电话号码组合总和顺序关心不关心关心不关心元素能选几次1 次1 次选/不选1 次多选一无限次参数visited 数组start传 i1indexstart传 ifor 起点每次从 0 开始从 start 开始从 0 开始新映射串从 start 开始收集时机叶子节点每次进入叶子节点sum target关键点顺序关心 → 每次从 0 开始visited顺序不关心 → start 参数往后选。元素可复用 → 传 i不可复用 → 传 i1复杂度分析时间复杂度最坏 O(N^(target/min))N 是候选数字个数target/min 是最大递归深度min 是最小的候选数。实际有剪枝运行速度更快空间复杂度O(target/min)递归深度最深的情况

相关新闻

基于51单片机的教室灯光自动控制系统设计与实现

基于51单片机的教室灯光自动控制系统设计与实现

1. 项目缘起:从“长明灯”到“智慧光”的校园节能实践每次晚上路过教学楼,看到那些空无一人的教室里依然灯火通明,心里总不是滋味。这不仅是能源的浪费,更是一种管理上的粗放。作为一名电子工程领域的从业者,我一直在思…

2026/7/30 3:23:27阅读更多 →
TL431与光耦反馈环路设计:从原理到实战的开关电源稳定之道

TL431与光耦反馈环路设计:从原理到实战的开关电源稳定之道

1. 项目概述:从“能用”到“稳定”的关键一跃 做开关电源,最怕的就是输出电压飘忽不定。你可能辛辛苦苦把主功率回路、变压器都算好了,一上电,空载电压还行,一带载,电压要么往下掉,要么往上冲&a…

2026/7/30 3:23:27阅读更多 →
Next.js 在 Web3 中的角色演变:从简单 DApp 前端到全栈链上应用的架构变迁

Next.js 在 Web3 中的角色演变:从简单 DApp 前端到全栈链上应用的架构变迁

Next.js 在 Web3 中的角色演变:从简单 DApp 前端到全栈链上应用的架构变迁 一、引言 2022 年的典型 DApp 前端:一个 create-react-app 项目,ethers.js 连接 MetaMask,所有的链上交互都在 useEffect 里手动管理状态。那时候 Next…

2026/7/30 3:23:27阅读更多 →
《城市:天际线2》真实街区规划:从交通流线到公共服务布局

《城市:天际线2》真实街区规划:从交通流线到公共服务布局

如果你是一名《城市:天际线2》的玩家,或者对城市建设模拟游戏感兴趣,那么最近可能被一个词频繁刷屏:"从零打造真实街区"。这听起来像是一个典型的营销口号,但背后其实反映了这款游戏,乃至整个模拟…

2026/7/30 4:35:41阅读更多 →
2025广东省职业院校技能大赛中职组“大数据应用与服务”第五套 完整参考答案

2025广东省职业院校技能大赛中职组“大数据应用与服务”第五套 完整参考答案

2025广东省职业院校技能大赛中职组“大数据应用与服务”第五套 完整参考答案 赛题场景:互联网酒店数据分析 文章目录 2025广东省职业院校技能大赛中职组“大数据应用与服务”第五套 完整参考答案 1. 平台搭建、数据库安装与运维 1.1 基础环境 1.2 Hadoop 3.3.6 完全分布式 1.3…

2026/7/30 4:35:41阅读更多 →
顶级985,爆炸!多专业复试线大涨!

顶级985,爆炸!多专业复试线大涨!

顶级985,爆炸!多专业复试线大涨!一、学校及专业介绍北京理工大学(Beijing Institute of Technology,缩写为BIT),简称为北理工,位于北京市,是由国务院工业和信息化部主管&…

2026/7/30 4:35:40阅读更多 →
STM32F103C8T6 PWM配置全解析:从原理到电机驱动实战

STM32F103C8T6 PWM配置全解析:从原理到电机驱动实战

1. 项目概述:为什么是STM32F103C8T6的PWM?如果你手头有一块“蓝色药丸”(Blue Pill)或者任何基于STM32F103C8T6的最小系统板,那么你几乎不可避免地要和PWM打交道。这块芯片以其极高的性价比和丰富的片上资源&#xff0…

2026/7/30 4:35:40阅读更多 →
AI期刊论文写作工具实用测评

AI期刊论文写作工具实用测评

一、期刊论文写作的痛点:格式要求让人精疲力竭 对于每一位试图在学术期刊上发表论文的研究者来说,写作过程中的繁琐格式要求往往比内容本身更让人头疼。从标题、摘要、关键词到正文结构,尤其是参考文献的著录规则,任何一处差错都…

2026/7/30 4:35:40阅读更多 →
AI技术-监督微调SFT

AI技术-监督微调SFT

监督微调SFT 监督微调的本质是采用少量的高质量的"指令-回答",针对仅有续写功能的Base模型改造成会对话的小助手。因为模型的知识和能力全部依靠预训练,SFT算法可以激发响应指令分布。所以,这个阶段,提示词的质量远远比…

2026/7/30 4:33:40阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →