eg:輸入:k=3,n=9python
輸出: [[1,2,6],[1,3,5],[2,3,4]]app
輸入:k=2,n=5函數
輸出:[[1,4][2,3]]優化
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 """ 4 # @Time : 2019/12/19 21:11 5 6 # @Author : ZFJ 7 8 # @File : k個數的和爲n.py 9 10 # @Software: PyCharm 11 """ 12 ''' 13 1.初試化結果列表result=[] 14 15 2.定義回溯函數Flash_back(num,current,tmp,next_sum)其中num表示當前已經使用的數字的數量數,current表示當前訪問的數字, 16 tmp表示當前中間結果,next_sum表示下一步的目標和。 17 a.假設num==k,則說明了咱們已經使用了k個數; 18 b.假設next_sum==0,則說明tmp的中間結果正好是n,那麼咱們就能夠將tmp加入到result列表中去 19 c.須要注意咱們遍歷的區間是[current,10),由於只能是0-9之間的正數 20 d.如今咱們須要優化,即爲傳說中的剪枝: 21 1)假如j>next_sum,那麼就說明了接下來的數字都比目標和要大,直接break 22 2)執行回溯函數Flash_back(num+1,j+1,tmp+[j],next_sum-j) 23 3.再去執行Flash_back(0,1,[],n) 24 25 4.返回結果列表便可 26 27 28 ''' 29 30 31 class Solution(object): 32 def combinationSum3(self, k, n): 33 """ 34 :type k: int 35 :type n: int 36 :rtype: List[List[int]] 37 """ 38 # 1.定義結果列表 39 result = [] 40 41 # 2.定義回溯函數 42 def Flash_back(num, current, tmp, next_sum): 43 if num == k: 44 if next_sum == 0: 45 result.append(tmp) 46 return 47 for j in range(current, 10): 48 if j > next_sum: 49 break 50 Flash_back(num + 1, j + 1, tmp + [j], next_sum - j) 51 52 Flash_back(0, 1, [], n) 53 return result 54 55 56 a = Solution() 57 b = a.combinationSum3(k=3, n=7) 58 print(b)
我的總結:本體由於用到了回溯法,因此在效率上顯得不是很高,在思考,如何改進,歡迎你們一塊兒交流spa
時間複雜度:由於從頭至尾走了一遍,即爲O(n!)code
空間複雜度:只是藉助了列表存儲,因此是O(1)blog