判断数组是否单调 | 豆包MarsCode AI刷题

60 阅读3分钟

小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。

  • 当对于所有索引i <= j时,nums[i] <= nums[j],数组nums是单调递增的。
  • 当对于所有索引i <= j时,nums[i] >= nums[j],数组nums是单调递减的。 你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false。 要判断一个数组是否为单调数组,我们可以遵循以下步骤:
  1. 初始化变量

    • 定义两个布尔变量,increasingdecreasing,初始值都设为 true。这两个变量分别用来表示数组是否单调递增和单调递减。
  2. 遍历数组

    • 从数组的第二个元素开始(索引为 1),遍历整个数组直到最后一个元素。对于每个元素 nums[i] 和它的前一个元素 nums[i-1],进行比较。
  3. 比较元素

    • 对于每个 nums[i]nums[i-1]
      • 如果 nums[i] < nums[i-1],则数组不可能是单调递增的,因此将 increasing 设置为 false
      • 如果 nums[i] > nums[i-1],则数组不可能是单调递减的,因此将 decreasing 设置为 false
  4. 检查结果

    • 在遍历结束后,检查 increasingdecreasing 的值:
      • 如果 increasingdecreasing 中至少有一个为 true,则数组是单调的,返回 true
      • 如果两个变量都为 false,则数组不是单调的,返回 false
  5. 特殊情况处理

    • 如果数组长度为 1 或者数组已经是有序的(全部元素相同),则可以直接返回 true,因为这样的数组既是单调递增的也是单调递减的。

以下是这个算法的伪代码实现:

function isMonotonic(nums):
    if length(nums) <= 1:
        return true

    increasing = true
    decreasing = true

    for i from 1 to length(nums) - 1:
        if nums[i] < nums[i - 1]:
            increasing = false
        if nums[i] > nums[i - 1]:
            decreasing = false

    return increasing or decreasing

这个算法的时间复杂度是 O(n),其中 n 是数组 nums 的长度,因为我们只需要遍历数组一次。空间复杂度是 O(1),因为我们只使用了常数级别的额外空间。 对于包含重复元素的数组,判断是否为单调数组的算法不需要特别的优化,因为包含重复元素并不影响数组的单调性。一个数组可以是单调递增的,即使它包含相同的元素,只要没有元素违反递增的规则(即对于所有 i < jnums[i] <= nums[j])。同样,一个数组也可以是单调递减的,即使它包含相同的元素,只要没有元素违反递减的规则(即对于所有 i < jnums[i] >= nums[j])。

因此,上面提供的算法已经足够处理包含重复元素的数组。重复元素不会改变比较的结果,因为它们不会违反单调性的条件。算法的核心是比较相邻元素,而不是跳过重复的元素。

这里是处理包含重复元素的数组的算法步骤,实际上与之前的算法相同:

  1. 初始化变量

    • 定义两个布尔变量,increasing 和 decreasing,初始值都设为 true
  2. 遍历数组

    • 从数组的第二个元素开始(索引为 1),遍历整个数组直到最后一个元素。
  3. 比较元素

    • 对于每个 nums[i] 和它的前一个元素 nums[i-1]

      • 如果 nums[i] < nums[i-1],则将 increasing 设置为 false
      • 如果 nums[i] > nums[i-1],则将 decreasing 设置为 false
  4. 检查结果

    • 在遍历结束后,检查 increasing 和 decreasing 的值:

      • 如果 increasing 或 decreasing 中至少有一个为 true,则数组是单调的,返回 true
      • 如果两个变量都为 false,则数组不是单调的,返回 false
  5. 特殊情况处理

    • 如果数组长度为 1 或者数组已经是有序的(全部元素相同),则可以直接返回 true

伪代码实现与之前相同,不需要修改: