LeetCode40:组合总数II
题目链接:40. 组合总和 II - 力扣(LeetCode)
代码如下:
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used)
{
if(target == sum)
{
result.push_back(path);
return ;
}
for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)
{
if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false)
{
continue;
}
sum += candidates[i];
path.push_back(candidates[i]);
used[i] = true;
backtracking(candidates, target, sum, i + 1, used);
used[i] = false;
sum -= candidates[i];
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> used(candidates.size(), false);
path.clear();
result.clear();
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, 0, used);
return result;
}
};
这个题目和上一个组合分析不一样的是,这个题目每个数只能用一次,所以这个需要先对数组进行排序,为什么要排序呢,因为当你抽象成一个数的时候,这个时候如果不排序的话,那么你会得到之前就已经得到过的数组。
回溯三步走:
参数的设定:1.需要原数组,2.需要目标值,3.需要总和sum,4.需要bool类型的数组,用来标记
结束条件:也就是说当你回溯了这么多数之后,sum相加,等于target的话,那么就停止
单层循环语句:里面就是需要对于排序过的数组进行标记,比如[1, 1, 2],那么这个时候就特别需要注意这个1,1,不要让这个两个重复出现了。
原文地址:https://blog.csdn.net/Ricky_youngone/article/details/143884911
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!