解决方案
方法一:两次遍历
思路
如果数组单调递增或单调递减,那么该数组是单调的。由于 a <= b 和 b <= c 暗示着 a <= c,我们只需要检查相邻元素以确定数组是单调递增(或是递减)。我们可以在一次遍历中检查每个属性。
算法
要检查数组 A 是否单调递增,我们将检查每个 i 是否对应有 A[i] <= A[i+1]。对单调检查是类似的。
复杂度分析
-
时间复杂度:,其中 是
A的长度。 -
空间复杂度:。
方法二:一次遍历
思路
要在一次遍历中执行该检查,我们将会处理由 组成的比较流,分别对应 <,==,或 >。例如,对于数组 [1, 2, 2, 3, 0],我们将会看到数据流 (-1, 0, -1, 1)。
算法
跟踪 store,它的值等于所看到的第一个非零比较值(如果存在)。一旦我们看到与之相反的比较值,那么答案就变成了 False。
否则,每次比较值都必定在集合 中或是在 中,此时数组是单调的。
复杂度分析
-
时间复杂度:,其中 是
A的长度。 -
空间复杂度:。