#include <functional>
class Solution {
public:
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
sort(num.begin(), num.end());
vector<vector<int> > res;
vector<int> path;
vector<int> visited(num.size());
function<void(int, int)> dfs = [&](int i, int sum) {
if (sum == 0) {
res.push_back(path);
return;
}
for (int idx = i; idx < num.size(); ++idx) {
if (num[idx] > sum) {
return;
}
if (idx > 0 && num[idx - 1] == num[idx] && !visited[idx - 1]) {
continue;
}
path.push_back(num[idx]);
visited[idx] = 1;
dfs(idx + 1, sum - num[idx]);
visited[idx] = 0;
path.pop_back();
}
};
dfs(0, target);
return res;
}
};
跟#有重复项数字的全排列 解法是一样的,dfs去重即可。

京公网安备 11010502036488号