leetcode 面試題40 組合總和 II

2021-10-04 03:09:56 字數 1807 閱讀 3877

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...