Python小练习系列 Vol.8:组合总和(回溯 + 剪枝 + 去重)

🧠 Python小练习系列 Vol.8:组合总和(回溯 + 剪枝 + 去重)

💡 本期我们挑战 LeetCode 回溯题三件套之一 ------ 组合总和,深入掌握路径构建、剪枝策略与去重技巧!


🧩 一、题目描述

给定一个无重复正整数数组 candidates 和一个目标值 target,找出所有和为 target 的组合。每个数可以重复使用无限次。

示例:

python 复制代码
输入: candidates = [2,3,6,7], target = 7
输出: [[2,2,3], [7]]

🧠 二、解题思路

我们采用回溯算法 + 剪枝

  1. 尝试将 candidates[i] 加入当前组合路径;
  2. 若路径之和超过 target,立即剪枝;
  3. 每次递归从当前下标开始,允许重复使用数字;
  4. 当路径之和正好等于 target,加入结果集。

👨‍💻 三、Python代码实现

python 复制代码
def combination_sum(candidates, target):
    res = []
    path = []

    def dfs(start, total):
        if total == target:
            res.append(path[:])
            return
        if total > target:
            return
        for i in range(start, len(candidates)):
            path.append(candidates[i])
            dfs(i, total + candidates[i])  # 允许重复取,索引不变
            path.pop()

    dfs(0, 0)
    return res

📌 四、运行示例

python 复制代码
print(combination_sum([2, 3, 6, 7], 7))
# 输出:[[2, 2, 3], [7]]

🧩 五、解题小结

步骤 说明
递归结构 当前索引 + 当前路径和
剪枝条件 如果 total > target,立即 return
去重策略 控制递归起点,避免重复排列组合

✅ 本题是"回溯选数"类题目的标准模板。


💡 六、进阶挑战

  • 📦 如果数组中可能有重复数字,如何避免结果重复?(组合总和 II)
  • 🧠 只能使用每个数字一次,怎么改动递归逻辑?
  • 🚀 如果要求找出总和为 target 的最短组合呢?

❤️ 结语

组合总和不仅考验回溯技巧,更是刷题进阶路上的重要关卡,搞懂它,下一题你会更轻松!


👉 点个赞 👍 + 收藏 🌟,我们下期再战算法高地!

相关推荐
en-route6 分钟前
深入理解 Scikit-learn:Python 中最常用的机器学习库
python·机器学习·scikit-learn
努力还债的学术吗喽12 分钟前
PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码)
人工智能·pytorch·python·深度学习·基础组件·线性层·nn.linear
蒙奇D索大41 分钟前
【数据结构】图论核心应用:关键路径算法详解——从AOE网到项目管理实战
数据结构·笔记·学习·考研·算法·图论·改行学it
学c语言的枫子42 分钟前
数据结构——Dijkstra算法
数据结构·算法
Asmalin1 小时前
【代码随想录day 29】 力扣 860.柠檬水找零
算法·leetcode·职场和发展
宸津-代码粉碎机1 小时前
Redis 进阶:跳出缓存局限!7 大核心场景的原理与工程化实践
java·人工智能·redis·python
wan5555cn1 小时前
AI视频生成技术:从想象到现实的视觉革命
人工智能·笔记·深度学习·算法·音视频
极客代码2 小时前
第五篇:后端优化——位姿图的灵魂--从图优化到滑动窗口的联合状态估计
python·深度学习·计算机视觉·视觉里程计·slam·回环检测·地图构建
程序员小白条3 小时前
度小满运维开发一面
java·运维·python·职场和发展·运维开发
小狗照亮每一天3 小时前
【菜狗学聚类】序列嵌入表示、UMAP降维——20250930
算法·分类·聚类