You are given a 0-indexed m x n matrix grid consisting of positive integers.
You can start at any cell in the first column of the matrix, and traverse the grid in the following way:
From a cell (row, col), you can move to any of the cells: (row - 1, col + 1), (row, col + 1) and (row + 1, col + 1) such that the value of the cell you move to, should be strictly bigger than the value of the current cell.
Return the maximum number of moves that you can perform.
Example 1:
Input: grid = [[2,4,3,5],[5,4,9,3],[3,4,2,11],[10,9,13,15]]
Output: 3
Explanation: We can start at the cell (0, 0) and make the following moves:
- (0, 0) -> (0, 1).
- (0, 1) -> (1, 2).
- (1, 2) -> (2, 3).
It can be shown that it is the maximum number of moves that can be made.
Example 2:
Input: grid = [[3,2,4],[2,1,9],[1,1,7]]
Output: 0
Explanation: Starting from any cell in the first column we cannot perform any moves.
Constraints:
m == grid.length
n == grid[i].length
2 <= m, n <= 1000
4 <= m * n <= 105
1 <= grid[i][j] <= 106
矩陣中移動的最大次數。
給你一個下標從 0 開始、大小為 m x n 的矩陣 grid ,矩陣由若干 正 整陣列成。你可以從矩陣第一列中的 任一 單元格出發,按以下方式遍歷 grid :
從單元格 (row, col) 可以移動到 (row - 1, col + 1)、(row, col + 1) 和 (row + 1, col + 1) 三個單元格中任一滿足值 嚴格 大於當前單元格的單元格。返回你在矩陣中能夠 移動 的 最大 次數。
思路
題意不難理解,從第一列的任意一個格子出發,看看從左往右最遠能走幾步
。對於某個格子(i, j)
來說,他只需要去看這三個格子(i-1, j+1)
、(i, j+1)
、(i+1, j+1)
中的的值是否比自己大,從而決定到底要不要往那個格子走,所以這道題並不是暴力嘗試所有的路徑。
這裡我仍然用 DFS 來做這道題。做的時候,對於(i, j)
,如果這三個格子(i-1, j+1)
、(i, j+1)
、(i+1, j+1)
中的的值比(i, j)
大,我們才走過去,否則就不要走過去。
複雜度
時間O(mn)
空間O(n)
程式碼
Java實現
class Solution {
int count = 0;
int m;
int n;
public int maxMoves(int[][] grid) {
m = grid.length;
n = grid[0].length;
for (int i = 0; i < m; i++) {
dfs(grid, i, 0);
}
return count;
}
private void dfs(int[][] grid, int i, int j) {
count = Math.max(count, j);
if (count == n - 1) {
return;
}
for (int k = Math.max(i - 1, 0); k <= Math.min(i + 1, m - 1); k++) {
if (grid[k][j + 1] > grid[i][j]) {
dfs(grid, k, j + 1);
}
}
grid[i][j] = 0;// backtrack
}
}