zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    CodeForces-455A Boredom
    UVA-12627 Erratic Expansion
    汉诺塔系列问题
    CodeForces-999D Equalize the Remainders
    CodeForces-1061D TV Shows
    CodeForces-1061B Views Matter
    UVALive-7261 Xiongnu's Land
    HDU-4990 Reading comprehension
    -------------------------------用MyBatis处理表与表之间的关联关系----------------------------------
    -------------计算机里面算法-----------
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14699925.html
Copyright © 2011-2022 走看看