题解 | #牛群喂食#
牛群喂食
https://www.nowcoder.com/practice/591c222d73914c1ba031a660db2ef73f
考察的知识点:回溯;
解答方法分析:
- 对给定的
candidates数组进行排序,以便后续操作。这是为了确保生成的组合是按照升序排列的,避免重复的组合。 - 创建一个空的结果二维数组
res,用于保存符合要求的所有组合。 - 创建一个空的一维数组
combination,用于保存当前生成的组合。 - 调用递归辅助函数
backtracking,并传入排序后的candidates数组、目标数target、开始位置start、组合数组combination、结果数组res。 - 在
backtracking函数中,首先判断如果target已经减到0,说明找到了一个符合要求的组合,将其加入res,然后返回。 - 接下来使用一个循环遍历从开始位置
start到数组末尾的每个数字:如果当前数字candidates[i]大于目标值target,说明后面的数字都会大于target,直接返回。将当前数字candidates[i]加入组合数组combination。递归调用backtracking函数,传入更新后的目标数target - candidates[i]、当前位置i、组合数组combination和结果数组res。回溯,将刚刚加入的数字从组合数组combination中取出,继续下一轮的选择。 - 最后,将结果数组
res返回。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
vector<vector<int> > cowCombinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> combination;
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, combination, res);
return res;
}
private:
void backtracking(vector<int>& candidates, int target, int start,
vector<int>& combination, vector<vector<int>>& res) {
if (target == 0) {
res.push_back(combination);
return;
}
for (int i = start; i < candidates.size(); i++) {
if (candidates[i] > target) {
return;
}
combination.push_back(candidates[i]);
backtracking(candidates, target - candidates[i], i, combination, res);
combination.pop_back();
}
}
};