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

题目:

解法:

思路:

一、读题

  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

相关推荐
程序员-Benothing2 小时前
Linux文本排序统计命令:sort、uniq、wc、cut、tr实战
java·开发语言·算法
开发者联盟league2 小时前
c++11 使用chrono库转换时间点和字符串,计算时间点间隔
java·c++·算法
老歌老听老掉牙3 小时前
两个平面旋转平移坐标系间的坐标变换关系
python·算法·平面·旋转·平移
W.A委员会3 小时前
PID与PID整定
python·算法
冷雨夜中漫步3 小时前
YOLO快速入门——(2)YOLO V26安装与快速入门
图像处理·算法·yolo·计算机视觉
longlongzihan3 小时前
LeetCode 41. 缺失的第一个正数:从基础解法到原地哈希
c++·算法·leetcode
Omics Pro4 小时前
强生:以机理为中心!虚拟细胞世界模型
数据库·人工智能·python·深度学习·算法·机器学习·自然语言处理
FPGA信号处理4 小时前
【凸优化】第一节课(下):保凸运算、分离超平面与 Farkas 引理
人工智能·算法·机器学习
怕浪猫4 小时前
Agent 的记忆系统怎么设计?面试官想听的是这个
算法·面试·github