39. 组合总和(python3)
705
2019.12.18
发布于 未知归属地

描述

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

candidates 中的数字可以无限制重复被选取。

说明:

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

示例

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

示例

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

解题思路

  • 先对数组进行排序。
  • 进行递归处理。对每个元素均进行判断。为了滤除重复,需要将当前的索引带入即可。
class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        # 排序后, 有助于判断什么时候终止递归
        candidates.sort()
        r = []
        def dfs(arr, tmpArr, remain, start):
            # 终止条件
            if remain < 0: return
            # 找到组合. 但是需要拷贝tmpArr; 因为其为数组, 在函数外依旧被调用.
            # 解决方案是: 1. 当前处进行拷贝; 2. 每次传参时候拷贝(消耗内存, 不建议)
            if remain == 0:
                r.append(tmpArr[:])
                return
            # 对每个元素进行递归处理
            for i in range(start, len(arr)):
                # tmpArr的append/pop, 保证不会影响到各个元素的递归
                # 如果不想append/pop, 则在调用dfs时候, 进行拷贝: tmpArr+[arr[i]]即可.
                tmpArr.append(arr[i])
                dfs(arr, tmpArr, remain - arr[i], i)
                tmpArr.pop()

        dfs(candidates, [], target, 0)

        return r
评论 (0)