这题说实话有点晕晕乎乎的,最后直接把代码随想录的代码复制过来了。
要解决的问题是,尽管用了不同位置的相同元素,但是会产生相同的结果。
解决方法是排序后,跳过相同元素。
代码随想录那个used数组我属实没看懂,这个方法倒是看懂了。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum,
int startIndex) {
if (sum == target) {
result.push_back(path);
return;
}
for (int i = startIndex;
i < candidates.size() && sum + candidates[i] <= target; i++) {
// 要对同一树层使用过的元素进行跳过
if (i > startIndex && candidates[i] == candidates[i - 1]) {
continue;
}
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i + 1);
sum -= candidates[i];
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, 0);
return result;
}
};
标签:target,int,代码,随想录,vector,candidates,sum,总和
From: https://www.cnblogs.com/huigugu/p/18684778