【回溯-3】39.组合总和

发布时间:2026/10/4 18:46:54

【回溯-3】39.组合总和 题目描述给你一个无重复元素的整数数组candidates和一个目标整数target找出candidates中可以使数字和为目标数target的 所有不同组合并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同则两种组合是不同的。对于给定的输入保证和为target的不同组合数少于150个。示例 1输入candidates [2,3,6,7], target 7输出[[2,2,3],[7]]解释2 和 3 可以形成一组候选2 2 3 7 。注意 2 可以使用多次。 7 也是一个候选 7 7 。 仅有这两种组合。示例 2输入:candidates [2,3,5], target 8输出:[[2,2,2,2],[2,3,3],[3,5]]示例 3输入:candidates [2], target 1输出:[]解题思路方法一回溯 剪枝核心思路把问题看成树形结构每一层选择一个数字可以重复选同一个数字当和等于target时收集结果当和大于target时剪枝关键如何避免重复组合用start参数控制选择范围每次递归时从start开始遍历选了candidates[i]后下一层从i开始允许重复选当前数字但不能选i之前的数字避免重复组合具体过程示例candidates [2,3,6,7], target 7[] / / \ \ 2 3 6 7 /|\ |\ | 2 3 6 3 6 6 /|\ | | 2 3 6 3 6 6 | 2(和87剪枝) 有效路径: 2→2→3 (和7) ✅ 7 (和7) ✅代码实现class Solution { public: vectorvectorint combinationSum(vectorint candidates, int target) { vectorvectorint result; vectorint path; backtrack(candidates, target, 0, path, result); return result; } private: void backtrack(vectorint candidates, int target, int start, vectorint path, vectorvectorint result) { // 终止条件和等于 target if (target 0) { result.push_back(path); return; } // 剪枝和小于 0直接返回 if (target 0) return; // 从 start 开始遍历避免重复组合 for (int i start; i candidates.size(); i) { path.push_back(candidates[i]); // 选择 backtrack(candidates, target - candidates[i], i, path, result); // 递归注意传 i 而不是 i1 path.pop_back(); // 撤销 } } };复杂度分析设n是候选数组长度target是目标和。维度复杂度说明时间复杂度O(n^(target/min)))最坏情况每个位置可以选 n 个数字空间复杂度O(target/min)递归栈深度 path 长度更精确时间复杂度与解的数量和递归深度有关最坏情况为指数级。关键细节1. 为什么递归时传i而不是i1传i允许重复选当前数字如[2,2,3]传i1不允许重复选如 40 题「组合总和 II」这是本题和 40 题的核心区别。2. 为什么用start参数start控制当前层从哪个位置开始遍历避免产生重复组合。例子candidates [2,3],target 5如果不用start[2,3]和[3,2]都会出现重复用start选了 2 后下一层只能从 2 开始含 2不能选 3 之前的3. 为什么target 0要返回因为和已经超过target继续加只会更大直接剪枝。4. 排序优化可选如果先对candidates排序可以在target candidates[i]时提前breaksort(candidates.begin(), candidates.end()); // ... for (int i start; i candidates.size(); i) { if (target candidates[i]) break; // 后面的更大直接结束 // ... }方法二动态规划完全背包代码实现class Solution { public: vectorvectorint combinationSum(vectorint candidates, int target) { vectorvectorvectorint dp(target 1); dp[0] {{}}; for (int c : candidates) { for (int j c; j target; j) { for (auto comb : dp[j - c]) { vectorint newComb comb; newComb.push_back(c); dp[j].push_back(newComb); } } } return dp[target]; } };复杂度时间 O(n × target × 解的数量)空间 O(target × 解的数量)缺点需要存储所有中间结果空间大。两种方法对比方法时间复杂度空间复杂度推荐度回溯 剪枝指数级O(target/min)⭐⭐⭐⭐⭐动态规划O(n × target × 解的数量)O(target × 解的数量)⭐⭐⭐总结要点说明核心思想回溯从 start 开始遍历可以重复选当前数字关键条件递归时传i允许重复用start避免重复组合终止条件target 0收集结果target 0剪枝时间复杂度指数级空间复杂度O(target/min)
延伸阅读

更多相关文章

2026/10/4 18:41:54

OpenCV+skimage中心线提取实战:从二值化到骨架化全流程解析

做图像处理的同学,迟早会遇到“中心线提取”这个需求。不管你是做OCR字符识别、血管/道路骨架化,还是工业上检测细长零件的轴线,核心思路都是一样的:先做二值分析,再从目标区域中抽取出那条最具有代表性的一像素宽曲线…

2026/10/4 23:22:07

大模型训练显存测量与预算决策:从理论估算到实操优化

1. 训练侧显存测量与预算决策的整体思路拆解显存不够用这件事,几乎每个做大模型训练或微调的人都撞过墙。模型加载到一半报 OOM,训练跑了几十步突然崩掉,或者明明卡上还有余量却怎么都塞不下更大的 batch size——这些问题的根源往往不是“显…

2026/10/4 23:22:07

Unity MCP 实战:Unity + Trae 的 MCP 配置与调试全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 23:22:07

插件加载失败怎么排查?从IAR到Harness理解插件机制

最早被“plugins”这个词折腾到失眠,是因为一条让人摸不着头脑的报错:failed to load plugins web boot: 2 entries did not activate linxin666/dsh-p。这行信息里每个词都认识,组合在一起却像加密电报。后来我又在 IAR、MusicFree、Harness…

2026/10/4 23:22:07

DeepSeek模型全解析:TaoToken统一API通道赋能人工智能新纪元

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 23:22:07

离线蓝屏修复工具实战:从STOP错误码到PE命令行修复

简介:完美蓝屏修复工具是一款面向Windows系统用户的轻量级辅助工具,专门解决内核模式驱动程序或子系统引发非法异常而导致的蓝屏崩溃问题。与传统重装系统相比,它提供一键化检测与修复机制,普通用户、系统维护人员及运维初学者均可…

2026/10/4 23:17:07

半车模型Simulink仿真:从四分之一车进阶到俯仰动力学分析

做悬架仿真这些年,我经常被问到同一个问题:“四分之一车模型还不够用?为什么非得上半车模型?”答案其实很直接——四分之一车模型只能看单轮垂向跳动,压根反映不了车身俯仰,而俯仰恰恰是乘客晕车感的主要来…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑