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

题目考察的知识点

这道题目考察的是对有序数组进行元素去重和限制元素数量的问题。

题目解答方法的文字分析

题目要求重新分布数组中的牛群数量,使得每个位置上的牛群数量不超过 3 头。由于数组已经是升序排列的,我们可以通过遍历数组来实现这一目标。

具体步骤如下:

  1. 初始化一个变量 count 为 1,用于表示当前位置的牛群数量。
  2. 遍历数组 nums,从第二个元素开始(下标为 1):如果当前元素与前一个元素相同,将 count 增加 1。如果当前元素与前一个元素不同,将 count 重置为 1。如果 count 大于 3,表示当前位置的牛群数量超过了 3 头,将当前元素移除。
  3. 遍历结束后,nums 数组中的元素就是重新分布后的牛群位置。
  4. 首先处理了输入数组为空的情况,如果数组为空,则直接返回0

本题解析所用的编程语言

本题解析所用的编程语言是 C++。

完整且正确的编程代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int remove_duplicates_v3(vector<int>& nums) {
        if (nums.empty()) {
            return 0; // 输入数组为空,返回0
        }

        int count = 1; // 当前位置的牛群数量
        int newSize = 1; // 新的数组长度

        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] == nums[i - 1]) {
                count++;
            } else {
                count = 1;
            }

            if (count <= 3) {
                nums[newSize] = nums[i];
                newSize++;
            }
        }

        return newSize;
    }
};

在这个解决方案中,我们首先处理了输入数组为空的情况,如果数组为空,则直接返回0。然后,我们遍历数组 nums,对于每一个元素,我们检查其与前一个元素是否相同。如果相同,表示当前位置的牛群数量增加,否则重置计数器。如果计数器小于等于 3,我们将当前元素放到新的位置,并增加新的数组长度。遍历结束后,newSize 就是新的数组长度,而 nums 数组中的前 newSize 个元素就是重新分布后的牛群位置。

这种解决方案的时间复杂度是 O(n),其中 n 是数组 nums 的长度。

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