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

60 阅读3分钟

题目解析

题目描述

题目要求判断一个给定的数组是否为单调数组。单调数组分为两种情况:

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

思路

  1. 初始检查:首先检查数组是否为空或只有一个元素,这种情况下数组一定是单调的。
  2. 标志位:使用一个标志位 is_increasing 来记录数组的单调性。初始时设为 None,表示尚未确定。
  3. 遍历数组:通过遍历数组,检查每个元素与下一个元素的关系,更新标志位。
  4. 返回结果:如果遍历过程中发现矛盾(即数组既不是单调递增也不是单调递减),则返回 False。如果遍历完数组没有发现矛盾,则返回 True

图解

假设我们有一个数组 nums = [1, 2, 2, 3]

  1. 初始时,is_increasing = None

  2. 遍历数组:

    • nums[0] = 1 和 nums[1] = 21 < 2,设置 is_increasing = True
    • nums[1] = 2 和 nums[2] = 22 == 2,继续。
    • nums[2] = 2 和 nums[3] = 32 < 3,继续。
  3. 遍历结束,没有发现矛盾,返回 True

代码详解

    # 检查数组是否为空或只有一个元素
    if len(nums) <= 1:
        return True
    
    # 初始化标志位,用于判断数组是单调递增还是单调递减
    is_increasing = None
    
    # 遍历数组,检查每个元素与下一个元素的关系
    for i in range(len(nums) - 1):
        if nums[i] < nums[i + 1]:
            # 如果当前元素小于下一个元素,说明数组可能是单调递增的
            if is_increasing is None:
                is_increasing = True
            elif is_increasing is False:
                return False
        elif nums[i] > nums[i + 1]:
            # 如果当前元素大于下一个元素,说明数组可能是单调递减的
            if is_increasing is None:
                is_increasing = False
            elif is_increasing is True:
                return False
        # 如果当前元素等于下一个元素,继续检查下一个元素
    
    # 如果遍历完数组没有发现矛盾,说明数组是单调的
    return True

if __name__ == '__main__':
    print(solution(nums=[1, 2, 2, 3]) == True)
    print(solution(nums=[6, 5, 4, 4]) == True)
    print(solution(nums=[1, 3, 2, 4, 5]) == False)

总结

  1. 时间复杂度O(n),其中 n 是数组的长度。我们只需要遍历数组一次。
  2. 空间复杂度O(1),只使用了常数个额外的空间。
  3. 关键点:通过标志位 is_increasing 来判断数组的单调性,并在遍历过程中及时发现矛盾。

个人感悟

1. 简洁性与效率:这个问题的解决方案非常简洁,只需要一次遍历数组,这让我意识到在编程中寻找最简单直接的方法的重要性。它不仅提高了代码的效率,也使得代码更易于理解和维护。

2. 标志位的使用:使用一个标志位来记录数组的单调性是一个巧妙的技巧。这让我思考到,在解决类似问题时,如何合理地使用变量来存储中间状态,可以极大地简化问题。

3. 边界条件的处理:在编写代码时,我总是提醒自己要检查边界条件,比如空数组或只有一个元素的情况。这种习惯有助于避免在实际运行时出现意外的错误。