zoukankan      html  css  js  c++  java
  • 216组合总和III

    题目:找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
    说明:所有数字都是正整数。解集不能包含重复的组合。
    示例 1:输入: k = 3, n = 7输出: [[1,2,4]]

    来源:https://leetcode-cn.com/problems/combination-sum-iii/

    法一:自己的代码

    思路:同前两个题大同小异,只是剪枝条件不同而已,这个题里面明确要求了最后得到的数组的长度,这个条件实际上就是剪枝条件

    from typing import List
    class Solution:
        def combinationSum3(self, k: int, n: int) -> List[List[int]]:
            results = []
            nums = [r+1 for r in range(9)]
            # a中存放生成的每个list, nums中存放用于遍历的数,
            def backtrack(a=[], nums=nums,):
                # 剪枝条件,如果长度不够,则不必判断和,直接进入下一次的遍历
                if len(a) < k:
                    pass
                # 如果满足条件,则长度一定是k,只要和是n就返回值,并且直接结束下一次的遍历
                elif sum(a) == n:
                    print(a)
                    results.append(a)
                    return
                for i,j in enumerate(nums):
                    # (len(a) < k),这个条件必须有,比如输入(2,18),如果没有这个条件,
                    # 就需要在上面的if语句中限制,这样限制更省时
                    if (sum(a) + j <= n) & (len(a) < k):
                        backtrack( a+[j], nums[i+1:])
                    # 如果if中有一个条件不满足,终止循环,因为nums中的数是由小到大排序的,
                    # 第n个数不满足的话,n+1个之后的一定不满足,直接终止循环
                    else:
                        break
            backtrack()
            return results
    if __name__ == "__main__":
        duixiang = Solution()
        a = duixiang.combinationSum3(2, 18)
        print('u', a)
    View Code
  • 相关阅读:
    php解析文本文件呈现在表格上
    nyoj 1058部分和问题
    nyoj 488素数环
    nyoj 82迷宫寻宝(一)
    nyoj58最少步数
    nyoj 325 zb的生日
    nyoj 20 吝啬的国度
    nyoj 349 Sorting It All Out
    nyoj 284
    PPT基础整理
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11956830.html
Copyright © 2011-2022 走看看