Leetcode刷題筆記(Python 找出所有相加之和為n的k個組合,組合中只允許含有1-9的正整數,並且每種組合中不存在重復的數字。)


eg:輸入:k=3,n=9

        輸出: [[1,2,6],[1,3,5],[2,3,4]]

        輸入: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)

 

個人總結:本體因為用到了回溯法,所以在效率上顯得不是很高,在思考,如何改進,歡迎大家一起交流

時間復雜度:因為從頭到尾走了一遍,即為O(n!)

空間復雜度:只是借助了列表存儲,所以是O(1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 Leetcode練習(Python):回溯算法類:第77題:組合:給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。 Leetcode練習(Python):數組類:第34題:給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。 你的算法時間復雜度必須是 O(log n) 級別。 如果數組中不存在目標值,返回 [-1, -1]。 Leetcode練習(Python):數組類:第15題:給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重復的三元組。 注意:答案中不可以包含重復的三元組。 Leetcode練習(Python):第387題:字符串中的第一個唯一字符:給定一個字符串,找到它的第一個不重復的字符,並返回它的索引。如果不存在,則返回 -1。 找出數組中兩數之和為指定值的所有整數對 Leetcode練習(Python):哈希表類:第202題:編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」定義為:對於一個正整數,每一次將該數替換為它每個位置上的數字的平方和,然后重復這個過程直到這個數變為 1,也可能是 無限循環 但始終變不到 1。如果 可以變為  1,那么這個數就是快樂數。 如果 n 是快樂數就返回 True ;不是,則返回 False 。 Python 中找出含有nan的所有行 Leetcode練習(Python):數組類:第59題:給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。 兩個大的正整數相加之和(C語言實現) Leetcode練習(Python):第258題:各位相加:給定一個非負整數 num,反復將各個位上的數字相加,直到結果為一位數。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM