大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的是一维平面上的计算,主要涉及数组的处理和逻辑判断。

题目解答方法的文字分析

我们需要击败所有的牛,而特殊攻击的角度始终垂直于 x 轴。也就是说,特殊攻击会沿着一条垂直线进行。我们的目标是找出一些特殊攻击的位置,使得每头牛的范围都被覆盖到,并且使用的特殊攻击次数尽可能地少。

假设我们选择在某个位置 x 处释放特殊攻击,那么所有包含 x 的牛的范围都会被击败。我们的目标是找到最少的特殊攻击次数,使得所有牛都被击败。

我们可以使用贪心算法来解决这个问题。首先,我们对所有牛的范围进行排序,按照牛的右边界从小到大排列。然后,我们从左到右遍历所有的牛,每次遇到一个牛,我们就选择在该牛的右边界处释放特殊攻击。这样,我们可以确保所有包含 x 的牛都会被击败,并且使用的特殊攻击次数尽可能地少。

举个例子来说,假设有三头牛的范围分别是 [1, 4], [3, 7], [6, 9]。按照右边界从小到大排序后的顺序是:[1, 4], [3, 7], [6, 9]。我们首先选择在位置 x=4 处释放特殊攻击,这样可以击败第一头牛和第二头牛。然后,我们再选择在位置 x=7 处释放特殊攻击,这样可以击败第三头牛。所以,我们只需要两次特殊攻击就能击败所有的牛。

本题解析所用的编程语言

C++

完整且正确的编程代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cow_ranges int整型vector<vector<>> 
     * @return int整型
     */
    int minParallelAttacks(vector<vector<int>>& cow_ranges) {
        // 首先按照牛的右边界从小到大对牛的范围进行排序
        sort(cow_ranges.begin(), cow_ranges.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[1] < b[1];
        });

        int count = 0; // 特殊攻击次数
        int prevX = INT_MIN; // 上一个特殊攻击的位置,初始化为负无穷

        for (const vector<int>& cow : cow_ranges) {
            // 如果牛的范围左边界大于上一个特殊攻击的位置,说明需要释放新的特殊攻击
            if (cow[0] > prevX) {
                count++; // 特殊攻击次数加一
                prevX = cow[1]; // 更新上一个特殊攻击的位置为当前牛的右边界
            }
        }

        return count;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!