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:18 阅读更多 →
山东赋华陶瓷材料有限公司食品接触级陶瓷修复材料界面改性与固化工艺解析

山东赋华陶瓷材料有限公司食品接触级陶瓷修复材料界面改性与固化工艺解析

山东赋华陶瓷材料有限公司深耕陶瓷修复材料研发,其界面改性复合固化工艺可实现食品级修复层高致密性与耐候稳定性。一、行业陶瓷修复材料技术痛点背景当前商用陶瓷餐具修复领域存在三类核心技术瓶颈:一是无机填料与陶瓷基体界面结合力弱,经洗…

2026/7/30 3:22:18 阅读更多 →
有哪些用户行为分析平台?2026年用户数据驱动运营方案盘点

有哪些用户行为分析平台?2026年用户数据驱动运营方案盘点

2026年,中国生成式AI用户规模已突破5.5亿,小程序电商用户中女性占比超七成、中青年群体占近六成。用户行为分析早已不是锦上添花的工具,而是企业数据驱动运营的中枢神经。面对纷繁的平台选项,决策者的困惑高度集中:用户…

2026/7/30 3:22:18 阅读更多 →

最新新闻

VMware安装蓝屏与注册表错误:从虚拟化原理到彻底修复指南

VMware安装蓝屏与注册表错误:从虚拟化原理到彻底修复指南

1. 项目概述:当VMware遇上注册表与蓝屏如果你正在折腾虚拟机,尤其是VMware Workstation或者Player,那么“无法打开注册表项”和“一开虚拟机电脑就蓝屏重启”这两个拦路虎,你大概率迟早会碰上。这可不是什么小众问题,而…

2026/7/30 3:35:23 阅读更多 →
Unity动态河流与泥石流模拟:基于动态网格与着色器的程序化生成方案

Unity动态河流与泥石流模拟:基于动态网格与着色器的程序化生成方案

1. 项目概述:从静态水体到动态灾害的路径模拟在游戏开发、虚拟仿真和数字孪生项目中,河流与泥石流这类动态环境元素,往往是提升场景真实感与沉浸感的关键。传统做法可能是直接使用Unity的Terrain系统绘制静态水体,或者放置预制好的…

2026/7/30 3:35:23 阅读更多 →
Unity Recorder保姆级教程:录制透明背景序列帧与游戏视频

Unity Recorder保姆级教程:录制透明背景序列帧与游戏视频

1. 项目概述:为什么你需要一个“保姆级”的Unity Recorder教程?如果你正在用Unity开发游戏,无论是独立开发者还是团队中的一员,制作宣传视频、录制玩法演示、或者为UI和特效生成序列帧动画,都是绕不开的环节。你可能试…

2026/7/30 3:35:23 阅读更多 →
Android逆向实战:从APKTool解包到Smali修改金币的完整指南

Android逆向实战:从APKTool解包到Smali修改金币的完整指南

1. 项目概述:为什么我们需要一本Android逆向操作手册?在移动应用开发和安全研究的圈子里,Android逆向工程一直是一个既神秘又充满挑战的领域。你可能是一名开发者,想了解竞品应用的某个炫酷动画是如何实现的;或者是一名…

2026/7/30 3:35:23 阅读更多 →
PLC五层电梯控制系统开发与优化实战

PLC五层电梯控制系统开发与优化实战

1. 项目背景与核心需求五层电梯控制系统是工业自动化领域的经典实训项目,也是PLC编程入门的绝佳练手案例。去年我在某商业综合体设备改造项目中,负责了一套西门子S7-200 PLC控制的客梯系统升级。这个实战案例完美覆盖了PLC硬件选型、梯形图编程、组态界面…

2026/7/30 3:35:23 阅读更多 →
上海GEO优化服务真的能提升网站流量吗?

上海GEO优化服务真的能提升网站流量吗?

上海GEO优化服务真的能提升网站流量吗?大家好,我是20260609GEO,一个专注于分享真实使用体验的好物博主。今天我要和大家分享的是我在使用上海洽特科技的GEO AI搜索产品的一些真实感受。如果你也对提升网站流量感兴趣,不妨继续往下…

2026/7/30 3:34:23 阅读更多 →

日新闻

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

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

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

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻