大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
本题考察的知识点是数组的遍历和查找,以及对组合的判断和记录。
题目解答方法的文字分析
首先,我们需要找到满足条件的三只牛的组合,即满足三只牛的能找到的草料数量之和等于目标和T,并且满足nums[i] <= nums[j] <= nums[k]。在这里,我们可以考虑使用三重循环来遍历所有可能的组合,并判断是否满足条件。
为了避免重复的牛群组合,我们可以在遍历过程中设置一些条件,比如nums[i] > target / 3时可以直接跳出循环,因为在后续的遍历中,即使后面的牛的草料数量更大,也无法满足nums[i] <= nums[j] <= nums[k]的条件。
思路如下:
首先对数组进行排序,这样可以方便判断nums[i] <= nums[j] <= nums[k]。
使用三重循环遍历所有可能的组合,i从0到n-3,j从i+1到n-2,k从j+1到n-1,其中n为数组长度。
在循环中,对当前的三只牛判断是否满足条件:nums[i] + nums[j] + nums[k] == target,并且 nums[i] <= nums[j] <= nums[k]。
如果满足条件,将这个组合记录下来。
本题解析所用的编程语言:C++
完整且正确的编程代码
class Solution {
public:
vector<vector<int>> findThreeCows(vector<int>& nums, int target) {
vector<vector<int>> result;
int n = nums.size();
if (n < 3) {
return result;
}
// 首先对数组进行排序
sort(nums.begin(), nums.end());
for (int i = 0; i < n - 2; ++i) {
// 如果当前最小的牛的草料数量已经大于目标和的三分之一,后面无论如何都无法满足条件,直接退出循环
if (nums[i] > target / 3) {
break;
}
// 跳过重复的牛,避免重复组合
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1; // 左指针
int right = n - 1; // 右指针
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == target) {
result.push_back({nums[i], nums[left], nums[right]});
// 跳过重复的牛,避免重复组合
while (left < right && nums[left] == nums[left + 1]) {
++left;
}
while (left < right && nums[right] == nums[right - 1]) {
--right;
}
// 移动指针
++left;
--right;
} else if (sum < target) {
// 和小于目标值,左指针右移
++left;
} else {
// 和大于目标值,右指针左移
--right;
}
}
}
return result;
}
};

京公网安备 11010502036488号