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

88 阅读2分钟

题目分析

本题的目标是判断一个给定的数组是否是单调数组。我们需要判断数组是否满足以下条件之一:

  • 单调递增:对于所有索引 i <= jnums[i] <= nums[j]
  • 单调递减:对于所有索引 i <= jnums[i] >= nums[j]

这意味着数组中的元素要么是从左到右递增的(可能有相等元素),要么是从左到右递减的(可能有相等元素)。

思路

要解决这个问题,我们可以通过如下几个步骤来判断:

  1. 遍历数组:我们需要遍历数组,并通过比较相邻元素来判断数组是否单调。
  2. 判断单调递增:如果数组是单调递增的,那么对于任意相邻的元素 nums[i]nums[i+1],都应该满足 nums[i] <= nums[i+1]
  3. 判断单调递减:如果数组是单调递减的,那么对于任意相邻的元素 nums[i]nums[i+1],都应该满足 nums[i] >= nums[i+1]
  4. 同时判断两种情况:我们可以通过设置两个标志变量,分别用于判断是否递增和递减,如果两个标志都不成立,那么就说明数组既不是单调递增也不是单调递减。

步骤

  1. 初始化标志变量:设置两个标志 is_increasingis_decreasing,初始值都为 True

  2. 遍历数组

    • 如果发现 nums[i] > nums[i+1],则说明当前数组不是单调递增的,将 is_increasing 设置为 False
    • 如果发现 nums[i] < nums[i+1],则说明当前数组不是单调递减的,将 is_decreasing 设置为 False
  3. 判断结果:遍历完成后,如果 is_increasingis_decreasing 之一为 True,说明数组是单调的,返回 True;否则返回 False

    public class Solution {
    public boolean isMonotonic(int[] nums) {
    // 初始化两个标志
    boolean isIncreasing = true;
    boolean isDecreasing = true;
    
    // 遍历数组
    for (int i = 0; i < nums.length - 1; i++) {
        if (nums[i] > nums[i + 1]) {
            isIncreasing = false;  // 如果当前元素大于下一个元素,说明不是递增
        }
        if (nums[i] < nums[i + 1]) {
            isDecreasing = false;  // 如果当前元素小于下一个元素,说明不是递减
        }
    }
    
    // 判断是否单调
    return isIncreasing || isDecreasing;
    }
    }
    

时间复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们只需要一次遍历数组,时间复杂度是线性的。
  • 空间复杂度:O(1),只用了常数空间来存储标志变量,因此空间复杂度为常数级别。

总结

通过遍历数组并同时检查递增和递减的情况,我们能够有效地判断一个数组是否为单调数组。此方法时间复杂度为O(n),能够快速处理大规模数据。同时,由于只需要常数空间,因此空间复杂度较低,适用于大多数场景。