LeetCode.896 单调数列

186 阅读1分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

题目描述:

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

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

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

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

示例一

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

示例二

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

示例三

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

示例四

输入: [1,2,4,5]
输出: true

示例五

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

提示:

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

思路分析

遍历

题目要求判断单调递增或递减,一种简单的是遍历两遍,分别判断是否递增或递减,判断递增的时候,只要nums[i] > nums[i + 1],则代表不是递增,递减反之同理。

还有种优化的解法就是一次遍历,我们设置两个Boolean,一个代表递增,一个代表递减。当 A[i] < A[i - 1]时,decrease设置为true;当 A[i] > A[i - 1],increase设置为true。最后我们只需要判断两个布尔变量是否相互矛盾,即可以得到正确答案了。

AC代码

class Solution {
    fun isMonotonic(nums: IntArray): Boolean {
        var inc = false
        var dec = false
        for(i in 1 until nums.size) {
            if(nums[i] < nums [i-1]) {
                dec = true
            }
            if(nums[i] > nums [i-1]) {
                inc = true
            }
        }
        return !(inc && dec)

    }
}

总结

两次遍历很简单,一次遍历需要注意一些细节。

参考

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

[重拳出击] 两个布尔,一次遍历 - 单调数列 - 力扣(LeetCode) (leetcode-cn.com)

「手画图解」简洁的写法 | 笨猪本人现身 | LeetCode 896 单调数组 - 单调数列 - 力扣(LeetCode) (leetcode-cn.com)