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

67 阅读3分钟

问题描述

我们需要判断一个给定的数组是否为单调数组。单调数组有两种情况:

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

解题思路

  1. 初始化标志

    • 首先,我们需要确定数组是单调递增还是单调递减。可以通过比较数组的前两个元素来初始化一个标志。
    • 如果 nums[0] <= nums[1],则数组可能是单调递增的。
    • 如果 nums[0] >= nums[1],则数组可能是单调递减的。
  2. 遍历数组

    • 遍历数组中的每一对相邻元素,检查它们是否符合初始化的单调性标志。
    • 如果发现递增数组中有递减的情况,或者递减数组中有递增的情况,立即返回 false
  3. 返回结果

    • 如果在遍历过程中没有发现违反单调性的情况,则返回 true

关键步骤解释

  1. 初始化标志

    • 通过比较数组的前两个元素来确定数组是单调递增还是单调递减。
    • bool increasing = nums[0] <= nums[1];
    • bool decreasing = nums[0] >= nums[1];
  2. 遍历数组

    • 在遍历过程中,检查每一对相邻元素是否符合初始化的单调性标志。
    • for (int i = 1; i < nums.size() - 1; ++i)
    • 如果发现递增数组中有递减的情况,或者递减数组中有递增的情况,立即返回 false
  3. 返回结果

    • 如果在遍历过程中没有发现违反单调性的情况,则返回 true

详细步骤解释

  1. 初始化标志

    • 单调递增标志bool increasing = nums[0] <= nums[1];

      • 如果数组的第一个元素小于等于第二个元素,则数组可能是单调递增的。
    • 单调递减标志bool decreasing = nums[0] >= nums[1];

      • 如果数组的第一个元素大于等于第二个元素,则数组可能是单调递减的。
  2. 遍历数组

    • 循环遍历for (int i = 1; i < nums.size() - 1; ++i)

      • 从第二个元素开始遍历到倒数第二个元素。
    • 检查单调递增

      • if (increasing && nums[i] > nums[i + 1])

        • 如果当前元素大于下一个元素,说明数组不是单调递增的,返回 false
    • 检查单调递减

      • if (decreasing && nums[i] < nums[i + 1])

        • 如果当前元素小于下一个元素,说明数组不是单调递减的,返回 false
  3. 返回结果

    • 如果在遍历过程中没有发现违反单调性的情况,则返回 true

测试样例

  • 样例1nums = [1, 2, 2, 3]

    • 输出:True
    • 解释:数组是单调递增的。
  • 样例2nums = [6, 5, 4, 4]

    • 输出:True
    • 解释:数组是单调递减的。
  • 样例3nums = [1, 3, 2, 4, 5]

    • 输出:False
    • 解释:数组既不是单调递增也不是单调递减。

总结

通过初始化标志和遍历数组,我们可以有效地判断一个数组是否为单调数组。这个方法的时间复杂度为 O(n),其中 n 是数组的长度。