分析Clean Architecture MASA Framework - DDD設計(2)
阿新 • • 發佈:2022-05-10
40. 組合總和 II
給定一個候選人編號的集合 candidates
和一個目標數 target
,找出 candidates
中所有可以使數字和為 target
的組合。
candidates
中的每個數字在每個組合中只能使用 一次 。
注意:解集不能包含重複的組合。
示例 1:
輸入: candidates = [10,1,2,7,6,1,5], target = 8,
輸出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:
輸入: candidates = [2,5,2,1,2], target = 5,
輸出:
[
[1,2,2],
[5]
]
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
思路:
帶有剪枝的回溯演算法具體可看別人的這篇文章
回溯演算法秒殺所有排列/組合/子集問題 :: labuladong的演算法小抄
class Solution { public: vector<int>res; vector<vector<int>>ans; vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.begin(),candidates.end()); backtrack(candidates,0,target); return ans; } void backtrack(vector<int>& candidates,int index, int target){ if(target==0){ ans.push_back(res); return; } if(target<0)return; for(int i=index;i<candidates.size();i++){ // 剪枝邏輯,值相同的樹枝,只遍歷第一條 if (i > index && candidates[i] == candidates[i - 1]) { continue; } //做選擇 res.push_back(candidates[i]); backtrack(candidates,i+1,target-candidates[i]); //撤銷選擇 res.pop_back(); } } };