leetcode-40. 组合总和 II

题目

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

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

说明:

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。 

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]

解题思路

和组合总和基本一致,除了用过的数字不能再次使用外,还需要注意对重复的组合去重。

去重主要有2个方法,1个跳过相同的开头数字,1个是用set对形如(1, 7), (7, 1)这样的组合去重

代码

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        output = set()
        begin_set = set()
        def backtrace(backtrace_candidates: list, target: int, ans: list) -> None:
            if target == 0:
                output.add(tuple(ans))
                return
            if target < 0:
                return
            for index, each_candidate in enumerate(backtrace_candidates):
                if not ans:
                    if each_candidate in begin_set:
                        continue
                    else:
                        begin_set.add(each_candidate)
                backtrace(backtrace_candidates[index + 1:], target - each_candidate, ans + [each_candidate])
            return
        backtrace(sorted(candidates), target, [])
        return [list(item) for item in output]

你可能感兴趣的:(OJ题目记录)