LeetCode 216. 组合总和 III

216. 组合总和 III

Difficulty: 中等

找出所有相加之和为 n 的 _k _个数的组合组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

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

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

Solution

组合求和系列题目的第三题,回顾第39题和第40题提到的解题框架:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return

    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

回答两个问题:1. 递归什么时候结束?2. 元素是可以被重复使用的还是不可以被重复使用的?

  1. 数组内元素每次被使用之后,target减去该元素,直到target被减到0,说明找到了满足和为target的组合;并且组合的长度等于k
  2. 数组内的元素不重复,并且组合中不存在重复的数字,说明元素不能被重复使用

回答两个问题之后就能开心写出答案了,一次AC。

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        candidates = [i+1 for i in range(9)]
        res = []
        self.dfs(candidates, [], n, k, res, 0)
        return res

    def dfs(self, nums, path, target, k, res, start):
        if target < 0:
            return
        if target == 0 and len(path) == k: 
            res.append(path[:])
            return
        for i in range(start, len(nums)):
            path.append(nums[i])
            self.dfs(nums, path, target-nums[i], k, res, i+1)
            path.pop()
posted @ 2021-04-25 13:31  swordspoet  阅读(38)  评论(0编辑  收藏  举报