Leetcode40: 组合总和 II

题目描述:

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

**注意:**解集不能包含重复的组合。

代码思路:

  1. 排序
    • 首先,对 candidates 数组进行排序。排序的目的是为了后续能够方便地处理重复元素,并且有助于提前终止搜索(当当前数字已经大于剩余需要达到的目标值时)。
  2. 初始化结果列表
    • 创建一个空列表 ans,用于存储所有满足条件的组合。
  3. 定义回溯函数
    • find(s, use, remain) 是一个递归函数,用于寻找所有可能的组合。
      • s 是当前搜索的起始索引,用于避免重复使用数组中的同一个元素。
      • use 是当前已经选择的数字列表(组合)。
      • remain 是当前还需要达到的目标值。
  4. 回溯逻辑
    • 遍历从索引 s 到数组末尾的每个元素。
    • 如果当前元素与前一个元素相同(i > s and candidates[i-1] == candidates[i]),则跳过当前循环迭代,以避免重复组合。
    • 如果当前元素等于剩余目标值 remain,则将当前组合 use + [c] 添加到结果列表 ans 中,并返回(结束当前递归路径)。
    • 如果当前元素小于剩余目标值 remain,则递归调用 find 函数,更新起始索引为 i+1(因为当前元素已被使用),更新已使用的数字列表为 use + [c],更新剩余目标值为 remain - c
    • 如果当前元素大于剩余目标值 remain,则直接返回(结束当前递归路径,因为后续元素只会更大,无法再达到目标值)。
  5. 启动回溯
    • 调用 find(0, [], target) 开始回溯过程,初始时起始索引为 0,已使用的数字列表为空,剩余目标值为 target
  6. 返回结果
    • 最后返回结果列表 ans,其中包含了所有满足条件的独特组合。

代码实现:

复制代码
class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        ans = []
        def find(s,use,remain):
            for i in range(s,len(candidates)):
                c = candidates[i]
                if i>s and candidates[i-1]==candidates[i]:
                    continue
                if c == remain:
                    ans.append(use + [c])
                    return              
                if c < remain:
                    find(i+1,use + [c], remain - c)
                if c > remain:
                    return
        find(0,[], target)
        return ans
相关推荐
邦爷的AI架构笔记3 分钟前
GLM-5.1 接入踩坑记录:用免费开源模型搭个 AI 代码审计小工具
后端·算法
苏宸啊5 分钟前
哈希扩展问题
算法·哈希算法
汀、人工智能12 分钟前
[特殊字符] 第73课:打家劫舍
数据结构·算法·数据库架构·图论·bfs·打家劫舍
别或许19 分钟前
2、高数----数列极限(知识总结)
算法
汀、人工智能25 分钟前
[特殊字符] 第78课:乘积最大子数组
数据结构·算法·数据库架构·数组·前缀积·乘积最大子数组
tankeven25 分钟前
HJ168 小红的字符串
c++·算法
数据知道28 分钟前
claw-code 源码分析:cargo 视角的 definitive runtime——会话、压缩、MCP、提示构造如何落到系统语言?
算法·ai·claude code·claw code
汀、人工智能31 分钟前
[特殊字符] 第41课:翻转二叉树
数据结构·算法·数据库架构·图论·bfs·翻转二叉树
2301_8227032032 分钟前
大学生体质健康测试全景测绘台:基于鸿蒙Flutter的多维数据可视化与状态管理响应架构
算法·flutter·信息可视化·架构·开源·harmonyos·鸿蒙
鲸渔32 分钟前
【C++ 输入输出】cin、cout、cerr 与格式化输出
开发语言·c++·算法