思路:回溯搜索,先对数组排好序,然后从前往后搜索,记录当前已经累加的和当前已经加进来的元素。如果当前和已经等于目标值,加入到解中间去,如果大于目标值,回溯(因为已经排好序,不需要再搜索后面更大的元素),如果小,则加入当前元素(保证重复加入)。
code:
class Solution {
public:
void solveSum(vector<int> &A, int pos, int target, vector<int> curRet, int curSum, vector<vector<int> > &ret){
if(curSum == target){
ret.push_back(curRet);
return;
}
else if(curSum > target) return;
for(int i = pos;i < A.size();i++){
vector<int> temp = curRet;
temp.push_back(A[i]);
solveSum(A,i,target,temp,curSum+A[i],ret);
}
}
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > ret;
vector<int> curRet;
sort(candidates.begin(),candidates.end());
solveSum(candidates,0,target,curRet,0,ret);
return ret;
}
};
本文详细介绍了如何使用回溯搜索算法解决组合总和问题,通过排序数组并从前往后搜索,记录和累加元素,直到找到符合条件的解。文章包括代码实现和步骤解析,帮助读者理解算法原理和应用。
544

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



