LeetCode 39. 组合总和
📅 2026/8/1 3:50:12
👁️ 次浏览
题目描述给定一个无重复元素的整数数组candidates和一个目标整数target找出candidates中可以使数字和为target的所有不同组合。答案可以按任意顺序返回。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同则两种组合是不同的。例如输入candidates [2,3,6,7], target 7 输出[[2,2,3],[7]]初始思路这题可以使用“选或不选”的回溯模型。定义递归函数dfs(candidates, target, path, i)含义是当前正在考虑candidates[i]在还需要凑出target的情况下继续搜索所有可能组合。每一层有两个选择1. 选当前数字 candidates[i] 2. 跳过当前数字 candidates[i]因为题目允许同一个数字重复选择所以选了candidates[i]之后下一层仍然可以继续考虑candidates[i]。也就是选当前数字dfs(i) 不选当前数字dfs(i 1)解题思路这题和普通子集问题很像但多了一个关键条件同一个数字可以无限制重复被选取。所以当我们选择当前数字后不能直接进入i 1而是继续停留在i。以candidates [2,3,6,7]target 7为例当前考虑 2 选 2 - target 变成 5仍然可以继续选 2 不选 2 - 去考虑 3递归过程可以理解为1. 如果 target 0说明当前 path 的和刚好等于目标值加入答案 2. 如果 target 0说明当前路径已经超过目标值停止 3. 如果 i 越界说明没有数字可以继续考虑停止 4. 选择 candidates[i]递归 dfs(i) 5. 撤销选择递归 dfs(i 1)这里的“撤销选择”非常重要因为path是同一个列表对象选当前数字的分支结束后要恢复现场才能进入“不选当前数字”的分支。代码实现class Solution { ListListInteger ans; public ListListInteger combinationSum(int[] candidates, int target) { ans new ArrayList(); ListInteger path new ArrayList(); dfs(candidates, target, path, 0); return ans; } public void dfs(int[] candidates, int target, ListInteger path, int i) { if (target 0) { ans.add(new ArrayList(path)); return; } if (target 0 || i candidates.length) { return; } path.add(candidates[i]); dfs(candidates, target - candidates[i], path, i); path.remove(path.size() - 1); dfs(candidates, target, path, i 1); } }为什么选了还递归 i这是本题和普通“选或不选”子集题最关键的区别。普通子集问题中每个元素只能使用一次选 nums[i] 后下一层处理 i 1但这题允许重复使用当前数字选 candidates[i] 后下一层仍然处理 i比如目标是7当前数字是2选一次 2 后 target 5 还可以继续选 2 再选一次 2 后 target 3 还可以继续选 2 或跳过 2 去选 3所以递归写成dfs(candidates, target - candidates[i], path, i);而不是dfs(candidates, target - candidates[i], path, i 1);为什么不会产生重复组合这份写法中i只会保持不变或向右移动选当前数i 不变 跳过当前数i 1因此组合中的数字顺序不会回头。比如已经跳过了2进入3后就不会再回头选择2。这样可以避免生成[2,3,2]这类和[2,2,3]本质相同但顺序不同的重复组合。易错点1. dfs 的含义不能写成“把 candidates[i] 加入 path”dfs(i, target)的含义应该是当前考虑 candidates[i]还需要凑出 target“加入当前数”只是其中一个分支不是递归函数本身的含义。2. 选当前数后不能直接 i 1因为同一个数字可以重复选所以选了candidates[i]后下一层还是从i开始。只有在“不选当前数”时才进入i 1。3. 加入答案时要拷贝 path不能直接写ans.add(path);因为path后续还会继续被回溯修改。正确写法是ans.add(new ArrayList(path));4. 回溯后要恢复 path选择当前数字后path.add(candidates[i]);递归结束后要撤销path.remove(path.size() - 1);这样“不选当前数字”的分支才不会受到影响。5. 终止条件要覆盖 target 和 i当target 0时说明找到一个合法组合。当target 0或i candidates.length时说明当前路径不可能继续得到合法答案需要返回。复杂度分析设n candidates.lengthtarget为目标值min为数组中的最小值。递归深度最多约为target / min因为每次选择一个数后target至少会减少min。时间复杂度与最终搜索树规模有关常见估计为指数级。可以粗略理解为O(2^(target / min))量级。空间复杂度O(target / min)主要来自递归栈和path。如果把返回结果也计入空间还要加上所有组合占用的空间。复盘这题的核心不是简单套全排列或子集模板而是先判断当前层的选择模型。对于 39 题最清楚的模型是当前数字选不选如果选因为可以重复使用所以继续停留在当前下标i。如果不选说明当前数字以后都不再考虑进入i 1。只要能想清楚这两个分支代码里的递归方向就不会写乱。Tips组合总和可以记住一句话选当前数继续 dfs(i)跳过当前数dfs(i 1)。这里的i控制候选数字范围target控制还差多少path记录当前已经选择的组合。
1. 项目概述:从芯片到镜像,理解MTK分区表的枢纽在MTK(联发科)平台的Android设备开发中,无论是进行系统定制、固件升级还是深度调试,有一个文件你绝对绕不开,那就是scatter.txt。这个看似普通的文…
📅 2026/8/1 3:49:11
ComfyUI-Inpaint-CropAndStitch:终极智能局部修复指南 【免费下载链接】ComfyUI-Inpaint-CropAndStitch ComfyUI nodes to crop before sampling and stitch back after sampling that speed up inpainting 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-…
📅 2026/8/1 3:49:11
步入 2026 年,学术战场的规则早已悄然改写。曾经只需应对查重率的焦虑,如今已演变为一场关于 AI 痕迹的生死战。随着各大高校全面启用更智能、更精准的 AIGC 检测系统,论文审核的标准也愈发严苛。光是降低重复率已经不够,真正让无…
📅 2026/8/1 3:49:11
1. 项目缘起:从理论到仿真的跨越 做电子设计,尤其是数字电路和单片机应用,最头疼的是什么?我猜很多朋友会说是“焊接调试”。辛辛苦苦画好原理图,打板、买元件、焊接,一通操作下来,上电发现数码…
📅 2026/8/1 4:45:00
1. 项目概述:从爆火到“裸奔”的OpenClaw最近在AI圈子里,OpenClaw这个名字可以说是火得一塌糊涂。作为一个开源的多智能体(Multi-Agent)协作框架,它凭借“让AI像团队一样工作”的炫酷概念,在GitHub上迅速斩…
📅 2026/8/1 4:45:00
那天晚上,我打开一个4K60P的直拍视频,原本只是想快速浏览一下,结果从第一个音符响起就被牢牢按在了屏幕前。这不是那种常见的偶像舞台——华丽的群舞、整齐划一的动作、经过精密计算的镜头切换。相反,这是一个极其罕见的“个人作品…
📅 2026/8/1 4:45:00
Vin象棋:三分钟搭建你的AI象棋助手,免费体验专业级对弈指导 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi
还在为复杂的象棋局面头…
📅 2026/8/1 4:45:00
前言:AI 写论文乱象频发,实测 8 款工具理清适配边界
每到毕业季,本科生、硕博生都会扎堆寻找 AI 论文辅助工具,市面上各类写作软件层出不穷,但普遍存在几类硬伤:虚假参考文献、无法匹配本校格式、不支持公式…
📅 2026/8/1 4:45:00
1. 从“单打独斗”到“模块化协作”:为什么需要子VI如果你刚开始学LabVIEW,可能和我当初一样,把所有代码都往一个VI的前面板和程序框图里塞。一个按钮、一个图表、一段计算逻辑,全都挤在一起。刚开始项目简单,看起来还…
📅 2026/8/1 4:44:00
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/1 0:00:26
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/1 0:00:30
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/1 0:00:30
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/8/1 1:20:16
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/8/1 1:20:19
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/8/1 1:20:17
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/1 0:00:26
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/1 0:00:30
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/1 0:00:30