Leetcode刷題筆記(Python 找出全部相加之和爲n的k個組合,組合中只容許含有1-9的正整數,而且每種組合中不存在重複的數字。)

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

相關文章
相關標籤/搜索