力扣日記 039 組合總和 回溯演算法

2021-10-02 08:35:07 字數 2293 閱讀 3890

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

candidates 中的數字可以無限制重複被選取。解集不能包含重複的組合

第一次做回溯演算法,磨磨唧唧乙個多小時總歸做出來了。

class

solution

:def

combinationsum

(self, candidates: list[

int]

, target:

int)

-> list[list[

int]]:

#因為是求和,所以對陣列進行公升序排序

candidates.sort(

) ls1,lst,

sum=

,,0

我的回溯演算法採用遞迴的方式:

def

sum(candidates, target:

int)

:nonlocal ls1,lst,

sumfor i in candidates:

#對陣列做for迴圈,滿足if語句則進入遞迴

sum+= i;

ifsum

< target:

sum(candidates, target)

ls1.pop(

)sum

-= i

#不滿足if語句時,進行如下兩種操作,並退出遞迴

elif

sum== target:

sum-=i

ifsorted

(ls1)

notin lst::]

) ls1.pop(

)return

elif

sum> target:

sum-= i

return

sum(candidates,target)

return lst

執行用時 :136 ms, 在所有 python3 提交中擊敗了21.19%的使用者

記憶體消耗 :13.3 mb, 在所有 python3 提交中擊敗了62.46%的使用者

這裡的回溯演算法沒有很好的規避後面的無效迴圈,沒有好好利用最開始的排序,所以效率低下。

從大佬那抄過來的回溯演算法:

class

solution

:def

combinationsum

(self, candidates: list[

int]

, target:

int)

-> list[list[

int]]:

candidates.sort(

) n =

len(candidates)

res =

defback

(index,

sum, l):if

sum> target or index == n:

return

ifsum

== target:

for i in

range

(index, n):if

sum+ candidates[i]

> target:

break

back(i,

sum+candidates[i]

, l+

[candidates[i]])

back(0,

0,)return res

執行用時 :52 ms, 在所有 python3 提交中擊敗了94.16%的使用者

記憶體消耗 :13.3 mb, 在所有 python3 提交中擊敗了62.42%的使用者

————————————————————————————————

理論上講,公升序排列的陣列求和,一旦滿足sum == target,之後的數字要麼是重複的,要麼就sum > target or index == n,所以

if

sum== target:

return

這樣應該可以減少執行時間。

執行用時 :40 ms, 在所有 python3 提交中擊敗了99.67%的使用者

力扣日記 040 組合總和II 回溯演算法

給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。回溯演算法,主體類似組合總和 i cla...

力扣39 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。有時候剪枝不止需要加上附加條件,還需要對原有資料集進行改動,比如排序。class solution ...

力扣39 組合總和 遞迴 回溯 DFS

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...