题目描述
LC896. 单调数列
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 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
示例 3:
输入:[1,3,2]
输出:false
示例 4:
输入:[1,2,4,5]
输出:true
示例 5:
输入:[1,1,1]
输出:true
提示:
1 <= A.length <= 50000
-100000 <= A[i] <= 100000
解题思路
一次遍历,比较A[i]与A[i-1]的大小,记录结果用于下一对元素的单调性的比较。
代码
func isMonotonic(A []int) bool {
isIncrease := true
isDecrease := true
n := len(A)
for i:=1;i<n;i++{
if A[i-1] > A[i] && isDecrease {
isIncrease = false
} else if A[i-1]<A[i] && isIncrease {
isDecrease = false
} else if A[i-1]==A[i] {
continue
} else {
return false
}
}
return true
}
设置两个bool变量,isIncrease代表前一次比较数组是递增的(A[i-1]<=A[i]),isDecrease前一次比较数组是递减的(A[i-1]>=A[i],从1开始遍历数组A,比较A[i]和A[i-1]的大小,
- 如果 A[i-1] > A[i],并且isDecrease为true(在这里相当于A[i-2]>=A[i-1],即A[i-2]>=A[i-1]>A[i]),则可得目前数组单调递减,设置isIncrease为false;
- 如果 A[i-1] < A[i],并且isIncrease为true(在这里相当于A[i-2]<=A[i-1],即A[i-2]<=A[i-1]<A[i]),则可得目前数组单调递增,设置isIncrease为false;
- 如果 A[i-1] = A[i],则不影响之前递增或递减的判断,继续下一个值即可;
- 其余情况的讨论
4.1 如果 A[i-1] > A[i],并且isDecrease为false,则可知A[i-2] < A[i-1],而A[i-1] > A[i],所以不单调
4.2 如果 A[i-1] < A[i],并且isIncrease为false,则可知A[i-2] > A[i-1],而A[i-1] < A[i],所以不单调