LeetCode 40 組合總和 II(dfs)

2021-10-19 08:19:02 字數 1328 閱讀 3021

40. 組合總和 ii

給定乙個陣列 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]]通過次數130,700提交次數203,767

分析

假設整個陣列為c, 每個數只能使用一次,那麼我們在遍歷的時候,可以先將 c 陣列排序,這樣相同的元素會相鄰,我們比較容易統計出相同元素的個數,然後我們dfs遍歷即可。

dfs的時候,我們統計一下當前元素的個數,那麼當前元素我們可以選擇 1個、2個…,所以需要乙個for迴圈,使用cur陣列記錄我們選擇的元素,到最後dfs完畢之後,記得將 cur 陣列回溯。

class solution 

if(u == c.

size()

)return

;// 如果遍歷完畢,則回溯

// k表示下乙個和當前數不同的元素

int k = u +1;

while

(k < c.

size()

&& c[k]

== c[u]

) k++

;int cnt = k - u;

// 與當前數相同的數的個數

// 這個for迴圈很巧妙,

for(

int i =

0; i <= cnt && i * c[u]

<= target; i++

)// 回溯

for(

int i =

0; i <= cnt && i * c[u]

<= target; i++

) cur.

pop_back()

;}vectorint>>

combinationsum2

(vector<

int>

& c,

int target)

};

leetcode 40 組合總和

給定乙個陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的每個數字在每個組合中只能使用一次。說明 示例 1 輸入 candidates 10,1,2,7,6,1,5 target 8,所求解集為 1,7 1,2,...

leetcode40 組合總和 II

給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...

LeetCode 40 組合總和 II

給定乙個陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的每個數字在每個組合中只能使用一次。說明 示例 1 輸入 candidates 10,1,2,7,6,1,5 target 8,所求解集為 1,7 1,2,...