大家好,我是开车的阿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;
    }
};