尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

豆包 LeetCode 40. 组合总和 II Python3实现

豆包    LeetCode 40. 组合总和 II Python3实现 题目LeetCode 40.组合总和 II题意给定候选数组含重复数字找出所有和为 target 的组合每个元素只能使用1次结果不能包含重复组合核心要点排序 回溯 同层去重Python3 完整代码pythonfrom typing import Listclass Solution:def combinationSum2(self, candidates: List[int], target: int) - List[List[int]]:res []candidates.sort()def backtrack(start: int, path: List[int], remain: int): if remain 0: res.append(path.copy()) return for i in range(start, len(candidates)): # 剪枝当前数字已经大于剩余值后面更大直接退出 if candidates[i] remain: break # 同层去重避免重复组合 if i start and candidates[i] candidates[i - 1]: continue path.append(candidates[i]) backtrack(i 1, path, remain - candidates[i]) path.pop() backtrack(0, [], target) return res关键思路说明先排序方便去重和剪枝i1下一层从 i1 开始保证每个元素只用一次区别于39题组合总和I的i去重逻辑 istart nums[i]nums[i‑1]istart 只禁止同一递归层选取重复数字允许不同层级重复剪枝 candidates[i]remain 直接break后续数字更大无需遍历测试示例pythonsol Solution()print(sol.combinationSum2([10,1,2,7,6,1,5],8))[[1,1,6],[1,2,5],[1,7],[2,6]]print(sol.combinationSum2([2,5,2,1,2],5))[[1,2,2],[5]]如果你需要我可以提供带日志打印的回溯调试版本或者迭代版非递归实现。
返回列表