給定一個 set 數列,並給定一個 target,找到在這個 set 中能夠組合成 target 的所有數字組合,數字可以重複
這是一題典型的 backtracking 與 dfs 題
掌握這兩個演算法的觀念就可以解答
不過 python code 在寫的時候有遇到 shallow copy 的問題,導致最後的結果都是 空陣列
重點:
通常如果題目要求我們去求組合,我們幾乎都可以用 Backtracking
的方法來解
必要元素:
input
暫時 list
target
指針記下當時的位置跟值
Time Complexity:
Space Complexity:
class Solution:
def __init__(self):
self.res = []
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
comb = []
self.dfs(candidates, target, 0, 0, comb)
return self.res
def dfs(self, candidates: List[int], target: int, idx: int, res_sum: int, comb: List[int]):
if res_sum == target:
curr_comb = [c for c in comb]
self.res.append(curr_comb)
return
if res_sum > target:
return
for i in range(idx, len(candidates)):
comb.append(candidates[i])
self.dfs(candidates, target, i, res_sum + candidates[i], comb)
comb.pop()
class Solution:
def __init__(self):
self.res = []
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
def backtracking_helper(nums, comb, reminder, idx):
if reminder == 0:
self.res.append(comb[:])
return
if reminder < 0:
return
for i in range(idx, len(nums)):
comb.append(nums[i])
backtracking_helper(nums, comb, reminder - nums[i], i)
comb.pop()
comb = []
backtracking_helper(candidates, comb, target, 0)
return self.res
小技巧:python 的世界中要用 shallow copy 的方式,將值複製一份並 append 到 res
可以用 comb[:]
這個寫法