【力扣刷题】896. 单调数列

151 阅读1分钟

「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战

原题链接

896. 单调数列 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

如果数组是单调递增或单调递减的,那么它是单调的。

如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。

当给定的数组 A 是单调数组时返回 true,否则返回 false。

测试用例

示例 1:

输入: [1,2,2,3]
输出: true

示例 2:

输入: [6,5,4,4]
输出: true

参数限制

  • 1 <= A.length <= 50000
  • -100000 <= A[i] <= 100000

分析

如题,单调数列定义为,随着数列下标的增大,下一个数会大于等于当前数,此为递增数列;若下一个数小于等于当前数,则为递减数列

最佳的做法,就是,我们先通过开头的几个数,判断出这个数列是单调递增还是单调递减。为什么要说是需要几个数来判断呢,他的定义里指明了允许出现相等且相邻的两个数,因此,我们在做比较的时候,相邻且相等的两个数,直接跳过即可

还有一个注意点,当数组的长度小于 3 时,此必定为单调数列!

代码

如分析,我们若是根据开头的几个数判断此数列是递增或递减,代码会显得比较冗余。我们可以引入一个 标记,标记为空时,根据前后 2 个值赋予 true/false,后续比较的时候,直接判断前后数的单调行,以及是否和标记一致,这种写法就统一了递增与递减的判断逻辑,代码量少,且优雅

var isMonotonic = function(nums) {
    if (nums.length < 3) return true;
    let flag = null;
    for (let i = 0; i < nums.length - 1; i++) {
        if (nums[i] == nums[i + 1]) continue;
        if (flag == null) {
            flag = nums[i] > nums[i + 1];
        } else if (nums[i] > nums[i + 1] != flag) {
            return false;
        }
    }
    return true;
};

如代码,在 for 中,第一步过滤掉相邻相等数据,第二步为 flag 赋值,第三步使用 flag 和相邻值比较单调性

image.png

今天的力扣刷题就分享到这里,感谢大家的阅读~