整体思路很简单。一个一个往后加,直到和等于目标值。这其中,若当前和会大于目标值,则跳过当前数组值,与下一个相加。若当前和小于目标值,则继续往后加下一个数。另外一点就是,去重操作,要注意判重条件的确定。此处,因为每次加和时,开头的第一个数可以重复使用,故而通过i > m,判断是否为第一个数。若不为,判断该数是否与前一个数相等,若相等,则考虑后可知,结果会出现重复。就算存在用num[i - 1]时,也用到了num[i],且num[i]后不再有与num[i - 1]相等的数的这种情况,也已经被考虑在了num[i]中,不会有遗漏,故而放心去重即可。
class Solution {
private:
vector<vector<int>> ans;
vector<int> res;
public:
void Dfs(vector<int> &num, int target, int m, int cur) {
if (cur == target) {
ans.push_back(res);
return ;
}
else {
for (int i = m; i < num.size(); i++) {
if (cur + num[i] > target)
continue;
if (i > m && num[i-1] == num[i])
continue;
else {
res.push_back(num[i]);
Dfs(num, target, i + 1, cur + num[i]);
res.pop_back();
}
}
}
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
sort(num.begin(), num.end());
Dfs(num, target, 0, 0);
return ans;
}
};