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 的最短组合呢?

❤️ 结语

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


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

相关推荐
add45a2 分钟前
Python类型提示(Type Hints)详解
jvm·数据库·python
记忆张量MemTensor3 分钟前
AI 数据迁移指南|Claude 靠提示词搬家,MindDock 一键完整备份记忆
人工智能·python·开源·github·浏览器
juleskk4 分钟前
3.22 复试训练
算法
移远通信6 分钟前
Helios SDK开发指南__入门应用代码编写
python
还不秃顶的计科生6 分钟前
力扣第84题:完全平方数
算法·leetcode·职场和发展
天远Date Lab6 分钟前
Python实战:基于天远二手车估值API构建企业车队资产数字化管理方案
大数据·人工智能·python
tryCbest6 分钟前
Python之FastAPI 开发框架(第三篇):高级特性与实战
开发语言·python·fastapi
BestOrNothing_20157 分钟前
Ubuntu 22.04 下使用 VS Code 搭建 ROS 2 Humble 集成开发环境
c++·vscode·python·ros2·ubuntu22.04
2301_7765087210 分钟前
分布式系统监控工具
开发语言·c++·算法
暮冬-  Gentle°12 分钟前
C++与区块链智能合约
开发语言·c++·算法