【Leetcode解題】Combination Sum
題目
- 題目連結
- 目標函式 :
combinationSum(candidates, target)- Input :
candidates: List[int]、target: int - Output :
List[List[int]]
- Input :
解題概念
- 題意 :
- 給予一整數陣列
candidates與一目標整數target,需要回傳candidates所有獨立組合的陣列,其中選擇的數字總和為target。(組合的順序無所謂) candidates中同一數字可以被挑選無限次。- 總和為
target之獨立組合的數量 $\lt$ 150
- 給予一整數陣列
我的寫法
- 想法 : 我覺得可以使用 DFS
- 使用
solve(sum, candidate)的函式,sum為當回合需要處理的總和,candidate為當回合可以使用的數字陣列 - 而其中在遞迴時會有三種 cases 需要去處理,下列說明以
solve(sum = 7, candidate = [7, 6, 3, 2])- 不選
7+solve(sum = 7, candidate = [6, 3, 2]) - 只選
7一次 +solve(sum = 7 - 7, candidate = [6, 3, 2]) - 會選
7多次 +solve(sum = 7 - 7, candidate = [7, 6, 3, 2])
- 不選
- 最後將得到 3 個 cases 的結果彙整起來,再回傳結果
- 使用
- 遇到之困難 :
- 不知道要怎麼彙整 3 個 cases 的結果
- 不知道要怎麼設定遞迴回傳的資料型態
解答 or 其他優秀寫法
- 想法 :
- 其實根本不需要討論 3 個 cases 的部分
- 而
solve()根本不用回傳資料,而是直接對同一list進行修改即可,這樣就能解決回傳資料型態的問題 solve()使用參數如下 :target: 當回合需要處理的總和index: 目前指到candidate索引值path: 當前該狀況累積的路徑陣列
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23def combinationSum(self, candidates, target):
res = []
def solve(target, index, path):
# 若 target < 0,代表當前路徑不行,直接結束此路徑
if target < 0 : return
# 若 target == 0,代表當前路徑成立
if target == 0 :
res.append(path) # res 加入此路徑
return # 結束路徑
# 若 target > 0
for i in xrange(index, len(candidates)):
# 針對 candidates[index:len(candidates)],去個別計算此路徑加上該 candidate 後的結果
solve(target - candidates[i], i, path + [candidates[i]])
solve(target, 0, [])
return res - 成效 :
- Time Complexity : $O(n^2)$
- Runtime: 91 ms (faster than 14.29%)
- Memory Usage: 13.4 MB (more than 57.18%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


