Monotonic Array

A corgi smiling happily

Write a function that takes in an array of integers and returns a boolean representing whether the array is monotonic.

An array is said to be monotonic if its elements, from left to right, are entirely non-increasing or entirely non-decreasing.

Non-increasing elements aren’t necessarily exclusively decreasing; they simply don’t increase. Similarly, non-decreasing elements aren’t necessarily exclusively increasing; they simply don’t decrease.

Note that empty arrays and arrays of one element are monotonic.

Sample Input

1array = [-1, -5, -10, -1100, -1100, -1101, -1102, -9001]

Sample Output

1true

Hints

Hint 1

You can solve this question by iterating through the input array from left to right once.

Hint 2

Try iterating through the input array from left to right, in search of two adjacent integers that can indicate whether the array is trending upward or downward. Once you’ve found the tentative trend of the array, at each element thereafter, compare the element to the previous one; if this comparison breaks the previously identified trend, the array isn’t monotonic.

Hint 3

Alternatively, you can start by assuming that the array is both entirely non-decreasing and entirely non-increasing. As you iterate through each element, perform a check to see if you can invalidate one or both of your assumptions.

Optimal Space & Time Complexity

O(n) time | O(1) space - where n is the length of the array

Solution-1
1function isMonotonic(array) {
2 console.log(array)
3 let arrLen = array.length
4
5 if (arrLen <= 2) {
6 return true
7 }
8
9 let flow = ''
10 let i = 0, j = 1
11
12 while (i < arrLen && j < arrLen) {
13 if (flow === '') {
14 if (array[i] < array[j]) {
15 flow = "increasing"
16 } else if (array[i] > array[j]) {
17 flow = "decreasing"
18 } else {
19 i++
20 j++
21 }
22 } else {
23 let localFlow = ''
24 if (array[i] < array[j]) {
25 localFlow = "increasing"
26 if (localFlow !== flow) {
27 return false
28 }
29 } else if (array[i] > array[j]) {
30 localFlow = "decreasing"
31 if (localFlow !== flow) {
32 return false
33 }
34 }
35 i++
36 j++
37 }
38 }
39
40 return true
41
42}
Solution-2
1function isMonotonic(array) {
2 // Write your code here.
3 if (array.length <= 2) return true
4
5 let direction = array[1] - array[0]
6
7 for (let i = 2; i < array.length; i++) {
8 if (direction === 0) {
9 direction = array[i] - array[i - 1];
10 continue
11 }
12 if(breaksDirection(direction, array[i - 1], array[i])) {
13 return false
14 }
15 }
16 return true
17}
18
19function breaksDirection(direction, previousInt, currentInt) {
20 const difference = currentInt - previousInt
21 if (direction > 0) return difference < 0
22 return difference > 0
23}
Solution-3
1function isMonotonic(array) {
2 let isNonDecreasing = true;
3 let isNonIncreasing = true;
4 for(let i = 1; i < array.length; i++) {
5 if (array[i] < array[i - 1]) isNonDecreasing = false
6 if (array[i] > array[i - 1]) isNonIncreasing = false
7 }
8
9 return isNonDecreasing || isNonIncreasing;
10}

🛠️

Do you have any questions, or simply wish to contact me privately? Don't hesitate to shoot me a DM on Twitter.

Have a wonderful day.
Abhishek 🙏

Subscribe to my newsletter

Get email from me about my ideas, full-stack development resources, tricks and tips as well as exclusive previews of upcoming articles.

No spam. Just the highest quality ideas you’ll find on the web.