「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
题目描述:
896. 单调数列 - 力扣(LeetCode) (leetcode-cn.com)
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[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)