2020/3/19 打卡
給定乙個陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的每個數字在每個組合中只能使用一次。
說明:所有數字(包括目標數)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[ [1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
] 示例 2:
輸入: candidates = [2,5,2,1,2], target = 5,
所求解集為:
[ [1,2,2],
[5]]
這裡有個 主要的問題是 『candidates 中的每個數字在每個組合中只能使用一次』,所以這裡很大的牽扯到去重的問題。
本題難點:candidates=[1,7,1],target=8,,,那麼[1,7]和[7,1]重複
使用回溯+剪枝的演算法。 在三步走過程中,融入對兩步剪枝操作的判別。
1.特判,若candidates為空,則返回
2.回溯函式helper(),傳入引數:下一加和索引ii,當前已加和陣列tmp,下一目標target
(1)若target==0,說明當前和滿足條件,將當前加和陣列tmp加入res,並return。
(2)剪枝 因為已經將candidates排序,所以當下一目標小於下一待加和數時,return。
並且當下一待加和索引i==n時,return。(為了防止陣列越界,將條件i==n放在targetiandcandidates[j]==candidates[j−1](為了防止陣列越界,首先保證j>i,判斷是否和
*若滿足條件j>i and candidates[j]==candidates[j-1],則跳過,避免出現重複解,同時也進行了剪枝。
*否則,執行helper(j+1,tmp+[candidates[j]],target−candidates[j])
3.執行helper(0,,target),並返回res
時間複雜度:o(n!) 空間複雜度:o(n)
class solution:
def combinationsum2(self, candidates, target):
# 邊界條件
if(not candidates):
return
# 進行預排序操作
n=len(candidates)
candidates.sort()
res=
def helper(i,tmp,target):
# 當前和滿足條件,將當前加和陣列tmp加入res,並return
if(target==0):
return
# 對於 越界操作 無效解的去除。 因為是排序過的,所以可以直接判別出 餘值的滿足情況。
if(i==n or targeti and candidates[j]==candidates[j-1]):
continue
# i是新的dfs的起點, tmp儲存暫時路徑,最後是餘值。
helper(j+1,tmp+[candidates[j]],target-candidates[j])
# 外部調動dfs搜尋。
helper(0,,target)
return res
leetcode 面試題216 組合總和 III
2020 3 20 打卡 找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 9 的正整數,並且每種組合中不存在重複的數字。說明 所有數字都是正整數。解集不能包含重複的組合。示例 1 輸入 k 3,n 7 輸出 1,2,4 示例 2 輸入 k 3,n 9 輸出 1,2,6 1,3,5 ...
LeetCode 40組合總數
給定乙個陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的每個數字在每個組合中只能使用一次。說明 示例 1 輸入 candidates 10,1,2,7,6,1,5 target 8,所求解集為 1,7 1,2,...
LeetCode筆記 40組合總和
題目 給定乙個陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的每個數字在每個組合中只能使用一次。說明 示例 1 輸入 candidates 10,1,2,7,6,1,5 target 8,所求解集為 1,7 1...