You are given heights, a 2D array of size 'rows' x 'columns', where heights[row][col] represents the height of a cell (which would contain a row and column).
You are a Ninja training for an upcoming battle. You are situated in the top-left cell, (0, 0), and you hope to travel to the bottom-right cell, (rows-1, columns-1) (i.e., 0-indexed).
You can move up, down, left, or right, and you wish to find a route that requires the minimum time. A route's time is the maximum absolute difference in heights between two consecutive cells of the route.
You must return the minimum time required to travel from the top-left cell to the bottom-right cell.
Input: 'heights' = [[1, 8, 8],[3, 8, 9],[5,3,5]]
Output: 2
Explanation: The route of [1,3,5,3,5] has a maximum absolute difference of 2 in consecutive cells.
The first line contains two space-separated integers, 'rows' and 'columns'.
Next 'rows' lines contain 'columns' space-separated integers.
Output Format:
The only line contains the minimum time you require to travel from the top-left cell to the bottom-right cell.
3 3
1 2 3
3 8 4
5 3 5
1

The figure above describes the following heights list (array).
Here, The route of [1,2,3,4,5] has a maximum absolute difference of 1 in consecutive cells, which is better than the route [1,3,5,3,5].
3 3
1 3 1
9 9 3
9 9 1
2
rows == heights.length
columns == heights[i].length
1 <= rows, columns <= 100
1 <= heights[i][j] <= 10^6
Where ‘rows’ is the number of rows and ‘columns’ is the number of columns.
Time Limit: 1 sec
You can use a Depth-Search Fashioned algorithm to traverse the heights list (array) combined with a binary search to find out the minimum absolute difference.
The main idea here is to implement a dfs function with parameter TIME_LIMIT here: it is the maximum time you (as a ninja) can deal with. Then the idea is to use binary search to find the smallest TIME_LIMIT for which you can reach the ending point.
The algorithm will be-
O(m * n * log (H)), Where ‘m’ is the number of rows and ‘n’ represents the number of columns with ‘H’ being the size of the heights list (array).
Since each dfs will take O(m * n) time and we will have O(log H) steps in binary search, where H is biggest number in our grid we have, so final time complexity becomes O(m * n * log (H)).
O( m * n ), Where ‘m’ is the number of rows and ‘n’ represents the number of columns.
We are using a visited array/list to store keep track of already visited set of nodes hence, the Space Complexity is O( m * n ).