这一题是一种回溯法,在我看来就是深度搜索,从数组的第一个开始,一直在这个位置push(这个内层就是也是从这个位置开始的继续向后的push);直到temp中的和为0,直接存储下来,不然就从上一个位置开始,继续push,直到外层迭代结束;这样就避免了后面的值,再次利用前面的,导致和前面计算的结果重复;
void backtrack(vector<int> &arr,vector<vector<int>> &res, int target,int index, vector<int> &temp)
{
if (target < 0) return;
else if (target == 0)
{
res.push_back(temp); //虽然temp是引用,但是push进去的是一个赋值函数,是副本
//从而后面修改temp并不会修改之前的副本
}
else
{
for (int i = index; i < arr.size(); ++i)
{
temp.push_back(arr[i]);
backtrack(arr, res,target - arr[i], i, temp);
temp.pop_back();
}
}
}
vector< vector<int>> combination(vector<int> &arr,int target)
{
vector<vector<int>> res;
vector<int> temp;
for (int i = 0; i < arr.size(); ++i)
{
temp.push_back(arr[i]);
backtrack(arr, res,target - arr[i], i, temp);
temp.pop_back();
}
return res;
}