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
相关推荐
6Hzlia1 分钟前
【Hot 100 刷题计划】 LeetCode 72. 编辑距离 | C++ 经典 DP 增删改状态转移
c++·算法·leetcode
穿条秋裤到处跑1 分钟前
每日一道leetcode(2026.04.16):距离最小相等元素查询
算法·leetcode·职场和发展
XY_墨莲伊1 小时前
【实战项目】基于B/S结构Flask+Folium技术的出租车轨迹可视化分析系统(文末含完整源代码)
开发语言·后端·python·算法·机器学习·flask
小雅痞1 小时前
[Java][Leetcode simple] 1. 两数之和
java·算法·leetcode
somi71 小时前
ARM-驱动-09-LCD FrameBuffer
arm开发·驱动开发·算法·自用
乐迪信息1 小时前
乐迪信息:智慧港口AI防爆摄像机实现船舶违规靠岸自动抓拍
大数据·人工智能·算法·安全·目标跟踪
winxp-pic1 小时前
图片校正软件 操作说明及算法介绍
算法
wayz111 小时前
Day 6 编程实战:决策树与过拟合分析
算法·决策树·机器学习
ฅ ฅBonnie2 小时前
vLLM 推理后端简介
人工智能·python·算法
贾斯汀玛尔斯2 小时前
每天学一个算法--堆排序(Heap Sort)
数据结构·算法