求num数组中和为target的所有子集
可以用递归实现。
递归时的参数end是用来剪枝的,end从num.size()-1开始递减。如果num[end]*(end+1) < target则不可能有可行解,可以返回了。
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
vector<vector<int>> res;
sort(num.begin(), num.end());
vector<int> cur;
find(num, target, num.size() - 1, res, cur);
return res;
}
void find(vector<int> &num, int target, int end, vector<vector<int>>& res, vector<int>& cur)
{
if (target == 0)
{
res.push_back(cur);
return;
}
if (end < 0 || num[end] * (end + 1) < target)
return;
if (num[end] <= target)
{
cur.insert(cur.begin(), num[end]);
find(num, target - num[end], end - 1, res, cur);
cur.erase(cur.begin());
}
int temp = num[end];
while (end >= 0 && num[end] == temp) end--;
find(num, target, end, res, cur);
}
本文介绍了一种使用递归算法解决子集求和问题的方法。该算法通过剪枝技术优化搜索过程,寻找数组中所有元素之和等于目标值的子集组合。
5万+

被折叠的 条评论
为什么被折叠?



