An array is called 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: [6,5,4,4]
Output: true
Example 2:
Input: [1,3,2]
Output: false
Two Passes Algorithm to Test if Array is Monotonic
We can scan the array twice (two passes) with O(N) complexity (with space complexity O(1) – constant) – one to test if array is monotonic increasing and another to test if array is monotonic decreasing, based on the definition. The C++ implementation is straightforward, as follows:
class Solution {
public:
bool isMonotonicIncreasing(vector<int>& A) {
for (int i = 1; i < A.size(); ++ i) {
if (A[i] < A[i - 1]) {
return false;
}
}
return true;
}
bool isMonotonicDecreasing(vector<int>& A) {
for (int i = 1; i < A.size(); ++ i) {
if (A[i] > A[i - 1]) {
return false;
}
}
return true;
}
bool isMonotonic(vector<int>& A) {
return isMonotonicIncreasing(A) || isMonotonicDecreasing(A);
}
};
Alternatively, we define a integer comparison function sgn which returns -1, 0 or 1 to represent the relations between two integers, smaller, equal or bigger.
Next, we keep track of the prev variable which stores a non-zero comparison result. If we see the opposite, the answer is false.
class Solution {
public:
bool isMonotonic(vector<int>& A) {
auto sgn = [](int a, int b) { // local functions
return a < b ? -1 : (a == b) ? 0 : 1;
};
int prev = 0;
for (int i = 0; i < A.size() - 1; ++ i) {
int c = sgn(A[i], A[i + 1]);
if (c != 0) {
if (c != prev && prev != 0) {
return false;
}
prev = c;
}
}
return true;
}
};
One pass algorithm costs O(N) with space O(1) – constant.
For a Single Pass Algorithm that is written in Python: Teaching Kids Programming – Algorithm to Check If Array is Monotonic
–EOF (The Ultimate Computing & Technology Blog) —
Last Post: How to Find Largest Triangle Area using Shoelace Formula?
Next Post: The Programmers Dont usually work over weekend