題目描述
給定乙個陣列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...