题目:找出所有相加之和为 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)