題目:
給定一個由正整數組成的陣列 candidates
和一個目標數字 target
,找出候選陣列中可以讓數字相加等於目標數字的所有唯一組合。
candidates
中的數字都是獨特的。範例:
Input: candidates = [2,3,6,7], target = 7
Output: [[2,2,3],[7]]
Input: candidates = [2,3,5], target = 8
Output: [[2,2,2,2],[2,3,3],[3,5]]
限制條件:
遍歷所有組合,當前組合不行的話就往上一步,再繼續嘗試下一個組合
每嘗試一個 candidates[i],target 就減去 candidates[i],然後再嘗試下一個排列組合,直到 target == 0 表示剛好找到一個組合,那就把這組合加入 result 結果裡。
實作:
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> combination;
backtrack(candidates, target, combination, result, 0);
return result;
}
private:
void backtrack(vector<int>& candidates, int target, vector<int>& combination, vector<vector<int>>& result, int start) {
if (target == 0) {
result.push_back(combination);
return;
}
if (target < 0) return;
for (int i = start; i < candidates.size(); i++) {
combination.push_back(candidates[i]);
backtrack(candidates, target-candidates[i], combination, result, i);
combination.pop_back();
}
}
};