【题目练习】算法 组合总和

题目:

解法:

思路:

一、读题

  1. 同一个数字可以无限重复选;
  2. 找出所有不同组合,组合顺序不算区别:【2,3】 和 【3,2]】算同一个,不能重复;
  3. 保证答案数量 <150,不用担心结果爆炸。
  4. 可重复选取 → 回溯的时候,下一层还可以从当前这个下标继续选(不是 i+1)

组合不看顺序 → 为了避免 【2,3】、【3,2】这种重复答案,我们强制只能往后选,不能回头选前面的数字。

举例:选了下标 0 的 2,下一轮还可以选下标 0;但选到下标 1 的 3 之后,就不能回头再选下标 0 的 2。天然消除排列重复。

二、回溯

尝试选当前数字,递归往下走;递归回来撤销选择(回溯),尝试下一个数字。

三、

  1. start:本次只能从 start 下标开始选,防止回头造成重复组合
  2. sum:当前已经累加的总和
  3. path:保存当前这条路径选中的数字(临时数组)
  4. candidates:原数组
  5. target:目标和
  6. returnSize:返回答案行数
  7. returnColumnSizes:每一行答案的长度
  8. res:存放最终所有组合的二维数组

递归终止条件

  1. sum == target:找到一组答案,把 path 拷贝存入 res,return;
  2. sum > target:和超了,直接 return(剪枝,不用继续往下搜)

递归逻辑

循环 i 从 start 到数组末尾:

1、sum + candidates i <= target:才继续递归(剪枝优化)

2、把 candidates i 加入 path

3、递归调用:i 不变!因为可以重复选当前元素(重点!和组合 II 区分)

4、递归返回,回溯:删掉 path 末尾元素,尝试下一个 i

相关推荐
j7~2 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py3 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing3 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客3 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法
not coder4 小时前
一文讲通--从树到红黑树
数据结构·算法
octopus_c4 小时前
C++ 入门
开发语言·c++·算法
ZhengEnCi5 小时前
2026年10月30日AI早报:Gemini 4 Carbon登顶、DeepSeek融资1055亿、智元机器人上岗实测
人工智能·算法
强哥聊算力5 小时前
《算力江湖·Intel帝国往事》第三集:安迪·格鲁夫的铁血时代:Intel为什么能把对手逼到墙角?
运维·人工智能·科技·算法·ai·gpu算力
Shaoshing5 小时前
LeetCode100 11. 盛最多水的容器
算法·leetcode
骑着蜗牛撵大象3276 小时前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练