leetcode 39 組合總和

2021-09-25 18:11:57 字數 1547 閱讀 6943

刷題思路筆記,加油!

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

遞迴實現回溯法的深度優先搜尋策略,帶重複項的排列樹,複雜度o(n!)

改進:先對 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...