在力扣 題目39-- 組合總和中我們做過類似的題
而40題多加了條件 即 有重複數字而且每個數只能選一次
其實我們可以從39題條件轉換一下,即無限制重複被選取->有限制重複被選取
例如 candidates = [2,5,2,1,2]
就是 1可以取1次 2可以取3次 5可以取1次
這樣的話就簡單了 我們只要在39題的基礎上加入限制數量 於是稍加改造即可
使用map容器 key做為數字 value作為數量 而且map也可以自動排序
在39題的基礎上加入
如果value為0則不選
如果value不為0則選 並且value-1
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6int binationsum(map& m, int &target, map::iterator position, int add, vector& test, vectorint>>&res)715
//四種情況 2.小於 add是上一輪給的值 如果這個數+it->first小於了 說明有可能成為解 更新一下add 繼續遞迴
16else
if (add + it->first
26//
四種情況 3.等於 add是上一輪給的值 如果這個數+it->first等於了 說明test加上it->first就是解 直接給res
27else
if(add + it->first ==target)
2833
//四種情況 4.大於 add是上一輪給的值 如果這個數 + it->first大於了 說明無解 直接返回 退出
34else37}
38return0;
39}4041
class
solution
51else
5255
}56 vectorint>>res;
57 vectortest;
58//
呼叫59 binationsum(m, target, m.begin(), 0
, test, res);
60return
res;61}
62};
63int
main() ;
66int target = 5
;67 vectorint>> res =sol.combinationsum2(candidates, target);
68for (int i = 0; i < res.size(); i++)
72 cout <
74 }
力扣40組合綜合II
對candidates進行遞減排序,從最大的元素開始依次與target進行比較 有三種情況出現 1,元素 target 該元素不可選,跳過該元素 2,元素 target 選擇該元素後,所構成的乙個vec元素組合之和滿足等於target 3,元素 需要注意的地方 什麼時候從vec的放入元素和拿出元素。...
40 組合總和 II
給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...
40 組合總和 II
給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...