You are given a 0-indexedm x n integer matrix grid. Your initial position is at the top-left cell (0, 0).
Starting from the cell (i, j), you can move to one of the following cells:
Cells (i, k) with j < k <= grid[i][j] + j (rightward movement), or
Cells (k, j) with i < k <= grid[i][j] + i (downward movement).
Return the minimum number of cells you need to visit to reach the bottom-right cell(m - 1, n - 1). If there is no valid path, return -1.
Example 1:
Input: grid = [[3,4,2,1],[4,2,3,1],[2,1,0,0],[2,4,0,0]]
Output: 4
Explanation: The image above shows one of the paths that visits exactly 4 cells.
Example 2:
Input: grid = [[3,4,2,1],[4,2,1,1],[2,1,1,0],[3,4,1,0]]
Output: 3
Explanation: The image above shows one of the paths that visits exactly 3 cells.
Example 3:
Input: grid = [[2,1,0],[1,0,0]]
Output: -1
Explanation: It can be proven that no path exists.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 105
1 <= m * n <= 105
0 <= grid[i][j] < m * n
grid[m - 1][n - 1] == 0
Solutions
Solution 1: Priority Queue
Let's denote the number of rows of the grid as \(m\) and the number of columns as \(n\). Define \(dist[i][j]\) to be the shortest distance from the coordinate \((0, 0)\) to the coordinate \((i, j)\). Initially, \(dist[0][0]=1\) and \(dist[i][j]=-1\) for all other \(i\) and \(j\).
For each grid \((i, j)\), it can come from the grid above or the grid on the left. If it comes from the grid above \((i', j)\), where \(0 \leq i' \lt i\), then \((i', j)\) must satisfy \(grid[i'][j] + i' \geq i\). We need to select from these grids the one that is closest.
Therefore, we maintain a priority queue (min-heap) for each column \(j\). Each element of the priority queue is a pair \((dist[i][j], i)\), which represents that the shortest distance from the coordinate \((0, 0)\) to the coordinate \((i, j)\) is \(dist[i][j]\). When we consider the coordinate \((i, j)\), we only need to take out the head element \((dist[i'][j], i')\) of the priority queue. If \(grid[i'][j] + i' \geq i\), we can move from the coordinate \((i', j)\) to the coordinate \((i, j)\). At this time, we can update the value of \(dist[i][j]\), that is, \(dist[i][j] = dist[i'][j] + 1\), and add \((dist[i][j], i)\) to the priority queue.
Similarly, we can maintain a priority queue for each row \(i\) and perform a similar operation.
Finally, we can obtain the shortest distance from the coordinate \((0, 0)\) to the coordinate \((m - 1, n - 1)\), that is, \(dist[m - 1][n - 1]\), which is the answer.
The time complexity is \(O(m \times n \times \log (m \times n))\) and the space complexity is \(O(m \times n)\). Here, \(m\) and \(n\) are the number of rows and columns of the grid, respectively.