题目链接: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(target == sum){result.push_back(path);return ;}for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 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);path.clear();result.clear();sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0, used);return result;}
};
这个题目和上一个组合分析不一样的是,这个题目每个数只能用一次,所以这个需要先对数组进行排序,为什么要排序呢,因为当你抽象成一个数的时候,这个时候如果不排序的话,那么你会得到之前就已经得到过的数组。
回溯三步走:
参数的设定:1.需要原数组,2.需要目标值,3.需要总和sum,4.需要bool类型的数组,用来标记
结束条件:也就是说当你回溯了这么多数之后,sum相加,等于target的话,那么就停止
单层循环语句:里面就是需要对于排序过的数组进行标记,比如[1, 1, 2],那么这个时候就特别需要注意这个1,1,不要让这个两个重复出现了。