题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。
说明:
1.所有数字(包括目标数)都是正整数。
2.解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[[1,2,2], [5]]
题解:
class Solution
{
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
{
int n = candidates.size();
sort(candidates.begin(), candidates.end()); //排序,方便后面去重
vector<vector<int>> res;
vector<int> cur_path;
//lambda函数
function<void(int,int)> dfs_backtrace = [&] (int idx, int cur_sum)
{
if (cur_sum == target)
{
res.push_back(cur_path);
return ;
}
for (int i = idx; i < n; i ++) //从不同的点作为起点!!!!!!
{
if (cur_sum + candidates[i] > target) //大于了,后面的更大
break; //return 也行
if (idx < i && candidates[i-1] == candidates[i]) //有重复了
continue;
cur_path.push_back(candidates[i]); //使用这个数字
dfs_backtrace(i + 1, cur_sum + candidates[i]);
cur_path.pop_back(); //回溯,就是还回来
}
};
dfs_backtrace(0, 0);
return res;
}
};