?40. 組合總和 II - 力扣(LeetCode)
class Solution {
private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>&used){if(sum==target){result.push_back(path);return;}for(int i=startIndex;i<candidates.size();i++){if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==false){continue;}sum += candidates[i];path.push_back(candidates[i]);used[i] = true;backtracking(candidates, target, sum, i + 1, used); used[i] = false;sum -= candidates[i];path.pop_back();}}
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<bool>used(candidates.size(),false);sort(candidates.begin(),candidates.end());backtracking(candidates,target,0,0,used);return result;}
};
?元素的選取還是只取一次,構造樹形結構,但不同的是要將初始數組排序,這樣可以篩選出重復項,定義used數組,bool類型的,記錄此元素是否被取過,如果兩次取到元素相同,而且前一次取的used值為false則要進行去重。
?
組合問題(多條件)-CSDN博客?
其他邏輯與組合問題的邏輯一致,需要添加的是used數組的初始化,used的單層遞歸邏輯和回溯的邏輯。