An array is monotonic if it is either monotone increasing or monotone decreasing.
An array A is monotone increasing if for all i <= j, A[i] <= A[j]. An array A is monotone decreasing if for all i <= j, A[i] >= A[j].
Return true if and only if the given array A is monotonic.
Example 1:
Input: [1,2,2,3]
Output: true
Example 2:
Input: [6,5,4,4]
Output: true
Example 3:
Input: [1,3,2]
Output: false
Example 4:
Input: [1,2,4,5]
Output: true
Example 5:
Input: [1,1,1]
Output: true
Note:
1 <= A.length <= 50000
-100000 <= A[i] <= 100000
monotonic adj. 单调的;无变化的;产生单音调的(英语差还要先过单词关)
题干很简单,大概就是要判断一个数组是不是单调数组,不管他是单调递增还是单调递减。
根据我开始的代码,再结合官方给出的解题思路,我个人按照判断递增递减方法来将解法分类:
- 没有预先进行增减判断的。直接写出递增判断函数和递减判断函数后,都调用一次,然后两个函数的返回结果做或操作,即可得出正确答案(当然直接使用或操作的同时调用两个函数还可以里用短路原理减少一部分计算开支);或者是将两次遍历操作合并到一次遍历当中去,然后分开记录是否满足递增递减条件,最后对结果进行或操作并返回。
- 预先将第一个不相同的相邻数作为整体的单调性的。这也是我的解决方法,首先对数组进行遍历检测,直到找到第一对不相同的相邻数,根据A[i + 1] > A[i]的布尔结果作为整体的单调性。然后对剩余的数组成员进行遍历,同时判断每对相邻的 不相等 的数字是否满足预先判断的单调性结果。最后若全部满足,则返回true,否则返回false。
- 将每次相邻的单调性判断进行比较的。这种思路需要在遍历的过程中过滤掉相邻相等的情况,并设置一个变量用来存储上次的相邻不相等的一对数字的比较结果,如果和这次的比较结果不同,则认为不是单调数组。
下边我只会给出我自己的解决方法,其他的方法都可以在官方解题思路中找到。
经过比较虽然我的方法代码看起来非常不规整,但是运行时间和官方思路相同,并且占用的内存最少。
AC代码:
class Solution {
public boolean isMonotonic(int[] A) {
int aLen = A.length;
if (aLen == 1) {
return true;
}
int i = 0;
boolean isIncreasing = false;
while (i + 1 < aLen) {
if (A[i] != A[i + 1]) {
isIncreasing = A[i + 1] > A[i];
break;
}
++i;
}
++i;
while (i + 1 < aLen) {
if (A[i + 1] != A[i] && A[i + 1] > A[i] != isIncreasing) {
return false;
}
++i;
}
return true;
}
}
如有错误,欢迎指摘。也欢迎通过左上角的“向TA提问”按钮问我问题,我将竭力解答你的疑惑。