# Monotonic Array Problem

For the monotonic increasing array, we need to check if the previous index is less than the current index. And for the monotonic decreasing array, we need to check if the previous index is greater than the current index.

An array is monotonic if it is either increasing or monotonic decreasing.

### Introduction

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, 4]

Output: true``````

Example 2:

``````Input:[1, 2, 6, 2, 3]

Output: false``````

Example 3:

``````Input: [7, 2, 1]

Output: true``````

### Thought Process

An `array` is called monotonic if the `index` of each element increases from the first to the last, or if it decreases from the first to the last.

### Algorithm

We need to run two for loops to check if either of the loops returns true.

For the monotonic increasing array, we need to check if the previous index is less than the current index. And for the monotonic decreasing array, we need to check if the previous index is greater than the current index.

Finally, we return `true` if either of the loops evaluates to `true`.

Optimal way: we can do this using one pass but let us take a look at both algorithms.

## Solution

### Approach#1: Two-Pass Algorithm

Code: Monotonic Array: Two-Pass

``````public class MonotonicArray {
public static void main(String[] args) {
int[] input = {1, 2, 2, 3};
System.out.println(isMonotonic(input)); // true
}

public static boolean isMonotonic(int[] array) {
return isIncreasing(array) || isDecreasing(array);
}

public static boolean isIncreasing(int[] nums) {
for (int i = 1; i < nums.length; i++)
if (nums[i - 1] > nums[i]) {
return false;
}
return true;
}

public static boolean isDecreasing(int[] nums) {
for (int i = 1; i < nums.length; i++)
if (nums[i - 1] < nums[i]) {
return false;
}
return true;
}
}
``````

Complexity Analysis

We are doing two for loops above, and the overall time complexity is `O(n)`,  and space complexity is `O(1)`.

Let us optimize the above code snippet with a single loop.

### Approach#2: One-Pass Algorithm

Code: Monotonic Array: One-Pass

``````public class MonotonicArray {
public static void main(String[] args) {
int[] input = {1, 2, 2, 3};
System.out.println(isMonotonic(input)); // true
}

public static boolean isMonotonic(int[] array) {
boolean isIncreasing = true;
boolean isDecreasing = true;

for (int i = 1; i < array.length; i++) {
if (array[i] < array[i - 1]) {
isDecreasing = false;
}

if (array[i] > array[i - 1]) {
isIncreasing = false;
}
}

return isIncreasing || isDecreasing;
}
}``````

Complexity Analysis

Overall complexity analysis won’t change, but this optimised approach eliminates a loop here.

Hence, the complexity analysis for both approaches are time – `O(n)` and space – `O(1)`.

```

```