刷題思路筆記,加油!
給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。遞迴實現回溯法的深度優先搜尋策略,帶重複項的排列樹,複雜度o(n!)candidates 中的數字可以無限制重複被選取。
改進:先對 candidates.sort()排序,定義剪枝函式。
class solution:
def combinationsum(self, candidates: list[int], target: int) -> list[list[int]]:
res =
candidates.sort()
self.dfs(candidates, target, 0, , res)
return res
def dfs(self, nums, target, index, path, res):
if target == 0:
return
if path and target < path[-1]: #剪枝函式
return
for i in range(index, len(nums)):
self.dfs(nums, target-nums[i], i, path+[nums[i]], res)
檢視網上大佬解法,提到遞迴能解決的考慮迭代,這兩者的區別如下:
迭代:利用變數的原值推算出變數的乙個新值.如果遞迴是自己呼叫自己的話,迭代就是a不停的呼叫b.
遞迴中一定有迭代,但是迭代中不一定有遞迴,大部分可以相互轉換.能用迭代的不用遞迴,遞迴呼叫函式,浪費空間,並且遞迴太深容易造成堆疊的溢位.
class solution(object):
def combinationsum(self, candidates, target):
""":type candidates: list[int]
:type target: int
:rtype: list[list[int]]
"""candidates = sorted(set(candidates))
result = list()
stack = [(0, list(), target)]
cand_len = len(candidates)
while stack:
i, path, remain = stack.pop()
while i < cand_len:
if path and remain < path[-1]:
break
if candidates[i] == remain:
stack += [(i, path + [candidates[i]], remain - candidates[i])]
i+=1
return result
LeetCode 39 組合總和
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...
leetcode39 組合總和
參考 class solution if next num.size target num next 0 邊界條件 return 對於每個元素,有兩種處理方式,選當前元素或者不選當前元素 psol.push back num next 選當前元素 search num,next,psol,targe...
LeetCode39組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...