豆包MarsCode AI 刷题

77 阅读3分钟

问题描述

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

  • 当对于所有索引i <= j时,nums[i] <= nums[j],数组nums是单调递增的。
  • 当对于所有索引i <= j时,nums[i] >= nums[j],数组nums是单调递减的。

你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false

解析

好的,让我们详细解析一下这个题目及其解法。

题目描述

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

  • 当对于所有索引 i <= j 时,nums[i] <= nums[j],数组 nums 是单调递增的。
  • 当对于所有索引 i <= j 时,nums[i] >= nums[j],数组 nums 是单调递减的。

你需要编写一个程序来判断给定的数组 nums 是否为单调数组。如果是,返回 true,否则返回 false

测试样例

样例1:

输入:nums = [1, 2, 2, 3] 输出:True

样例2:

输入:nums = [6, 5, 4, 4] 输出:True

样例3:

输入:nums = [1, 3, 2, 4, 5] 输出:False

解题思路

  1. 理解单调数组的定义

    • 单调递增:数组中每个元素都大于或等于前一个元素。
    • 单调递减:数组中每个元素都小于或等于前一个元素。
  2. 初始化标志

    • 我们可以使用两个布尔变量 is_increasingis_decreasing 来分别表示数组是否单调递增和单调递减。
    • 初始时,将这两个变量都设置为 True
  3. 遍历数组

    • 从数组的第二个元素开始,遍历数组。
    • 对于每个元素 nums[i],比较它与前一个元素 nums[i-1]
      • 如果 nums[i] < nums[i-1],则数组不可能是单调递增的,因此将 is_increasing 设置为 False
      • 如果 nums[i] > nums[i-1],则数组不可能是单调递减的,因此将 is_decreasing 设置为 False
  4. 返回结果

    • 遍历结束后,如果 is_increasingis_decreasing 中有一个为 True,则数组是单调的,返回 True
    • 否则,返回 False

数据结构选择

  • 使用布尔变量来记录数组的单调性。

算法步骤

  1. 初始化 is_increasingis_decreasingTrue
  2. 遍历数组,比较相邻元素。
  3. 根据比较结果更新 is_increasingis_decreasing
  4. 返回 is_increasingis_decreasing 中为 True 的结果。

代码实现

def solution(nums: list) -> bool:
    # 初始化标志
    is_increasing = True
    is_decreasing = True
    
    # 遍历数组
    for i in range(1, len(nums)):
        if nums[i] < nums[i - 1]:
            is_increasing = False
        if nums[i] > nums[i - 1]:
            is_decreasing = False
    
    # 返回结果
    return is_increasing or is_decreasing

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. 初始化标志

    • is_increasingis_decreasing 分别用于记录数组是否单调递增和单调递减。
  2. 遍历数组

    • 从数组的第二个元素开始遍历,比较当前元素 nums[i] 和前一个元素 nums[i-1]
    • 如果 nums[i] < nums[i-1],则数组不可能是单调递增的,因此将 is_increasing 设置为 False
    • 如果 nums[i] > nums[i-1],则数组不可能是单调递减的,因此将 is_decreasing 设置为 False
  3. 返回结果

    • 遍历结束后,如果 is_increasingis_decreasing 中有一个为 True,则数组是单调的,返回 True
    • 否则,返回 False

测试样例

  • 代码中包含了三个测试样例,分别对应题目中的样例1、样例2和样例3。
  • 运行代码后,输出结果应为 True,表示代码正确。

通过这种方式,我们可以高效地判断数组是否为单调数组。