40 組合總和 II

2021-10-17 07:22:49 字數 1789 閱讀 4408

題目描述

給定乙個陣列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]]

題解:

與 陣列總和 的區別就是:有重複數字,每個數字只能用一次。

延續 陣列總和 的思路,上一題中因為元素可以重複使用,所以我們在遞迴時,沒有改變下標,即:

dfs

( candidates, i, now + candidates[i]

, target )

;

而這題每個元素只能使用一次,所以遞迴時需要修改下標,即:

dfs

( candidates, i +

1, now + candidates[i]

, target )

;

還有乙個最重要的問題:因為有重複元素,如果我們還是按照 陣列總和 的**來,肯定有重複的答案。

舉個例子:candidates=[1, 1, 2, 5, 6, 7, 10], target = 8

在從pos = 0開始搜尋時,找到乙個答案[1, 2, 5]。如果接著從pos = 1開始搜尋,又會找到[1, 2, 5],出現重複答案。

解決辦法很簡單,只需要在迴圈中加乙個判斷:

if

( i > p && candidates[i]

== candidates[i -1]

)continue

;

這樣會不會漏掉什麼情況呢?答案是不會,具體在紙上畫畫就知道了。

**:

class

solution

if( p >= candidates.

size()

)return

;for

(int i = p; i < candidates.

size()

;++i )

else

return;}

} vectorint>>

combinationsum2

(vector<

int>

& candidates,

int target)

;dfs

( candidates,0,

0, target )

;return ret;}}

;/*記憶體:10.4mb,擊敗:96.99%

*/

40 組合總和 II

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

40 組合總和 II

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

40 組合總和 II

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