給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的每個數字在每個組合中只能使用一次。
說明:所有數字(包括目標數)都是正整數。
解集不能包含重複的組合。
defcombinationsum
( candidates, target:
int)
: res=
; c_l=
len(candidates)
;def
find
(output,newtarget,i,c_l)
:sorted
(output):同乙個陣列,不同順序是一樣的
if newtarget==
0and
sorted
(output)
notin res:
sorted
(output));
return
; 用來跳過這一k;防止重複計算當前值
if i>=c_l:
return
; 防止重複計算上一步的值;從上一步的i的i+
1開始迴圈
for k in
range
(i,c_l)
: now=candidates[k]
new_target=newtarget-now;
if new_target>=0:
用來跳過這一k;防止重複計算當前值
find(output+
[now]
,new_target,k+
1,c_l)
find(
,target,
0,c_l)
;return res
candidates=[2
,3,6
,7,5
,6,1
];print
(combinationsum(candidates,7)
)[[2
,5],
[1,6
],[7
]]
candidates 中的數字可以無限制重複被選取。
defcombinationsum2
( candidates, target:
int)
: res=
; c_l=
len(candidates)
;def
find
(output,newtarget,i,c_l)
:if newtarget==
0and
sorted
(output)
notin res:
sorted
(output));
return
; # if i>=c_l:return;
for k in
range
(i,c_l)
: now=candidates[k]
new_target=newtarget-now;
if new_target >=0:
k為當前index,為了可以重複使用當前值
find(output+
[now]
,new_target,k,c_l)
find(
,target,
0,c_l)
;return res
candidates=[2
,3,6
,7,5
,1];
print
(combinationsum2(candidates,7)
)[[1
,2,2
,2],
[2,2
,3],
[1,1
,1,2
,2],
[1,1
,2,3
],[2
,5],
[1,1
,1,1
,1,2
],[1
,3,3
],[1
,1,1
,1,3
],[1
,6],
[7],
[1,1
,5],
[1,1
,1,1
,1,1
,1]]
演算法 回溯 組合總和3
找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 9 的正整數,並且每種組合中不存在重複的數字。說明 所有數字都是正整數。解集不能包含重複的組合。示例 1 輸入 k 3,n 7 輸出 1,2,4 示例 2 輸入 k 3,n 9 輸出 1,2,6 1,3,5 2,3,4 這段 組合總和...
演算法 回溯 貪心 組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...
組合總和(回溯)
思路 回溯法 剪枝法 相當不錯的題目,遞迴三部曲 1.遞迴什麼時候結束 當target為0時,遞迴結束 2.每個遞迴的返回值是什麼 每個遞迴結束後表示已經完成了後續的剪枝操作 3.每級遞迴中要做的事 遍歷選取當前要剪的那個枝,即把當前的所有的數字 枝 依次過一遍 依次壓入 彈出 如輸入 candid...