「这是我参与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 和相邻值比较单调性
今天的力扣刷题就分享到这里,感谢大家的阅读~