給定乙個無重複元素的陣列 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...