目录
2684. 矩阵中移动的最大次数
题目描述:
实现代码与解析:
DP
原理思路:
2684. 矩阵中移动的最大次数
题目描述:
给你一个下标从 0 开始、大小为 m x n
的矩阵 grid
,矩阵由若干 正 整数组成。
你可以从矩阵第一列中的 任一 单元格出发,按以下方式遍历 grid
:
- 从单元格
(row, col)
可以移动到(row - 1, col + 1)
、(row, col + 1)
和(row + 1, col + 1)
三个单元格中任一满足值 严格 大于当前单元格的单元格。
返回你在矩阵中能够 移动 的 最大 次数。
示例 1:
输入:grid = [[2,4,3,5],[5,4,9,3],[3,4,2,11],[10,9,13,15]] 输出:3 解释:可以从单元格 (0, 0) 开始并且按下面的路径移动: - (0, 0) -> (0, 1). - (0, 1) -> (1, 2). - (1, 2) -> (2, 3). 可以证明这是能够移动的最大次数。
示例 2:
输入:grid = [[3,2,4],[2,1,9],[1,1,7]] 输出:0 解释:从第一列的任一单元格开始都无法移动。
实现代码与解析:
DP
class Solution {
public static int maxMoves(int[][] g) {
int n = g.length;
int m = g[0].length;
// 到此单元格走的最大步数
int[][] f = new int[n][m];
boolean[][] t = new boolean[n][m];
for (int i = 0; i < n; i++) {
t[i][0] = true;
}
// 竖着遍历
for (int j = 1; j < m; j++) {
for (int i = 0; i < n; i++) {
if (i - 1 >= 0 && j - 1 >= 0 && g[i][j] > g[i - 1][j - 1] && t[i - 1][j - 1]) { // 左上来的
f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + 1);
t[i][j] = true;
}
if (j - 1 >= 0 && g[i][j] > g[i][j - 1] && t[i][j - 1]) {
f[i][j] = Math.max(f[i][j], f[i][j - 1] + 1); // 左来的
t[i][j] = true;
}
if (i + 1 <= n - 1 && j - 1 >= 0 && g[i][j] > g[i + 1][j - 1] && t[i + 1][j - 1]) {
f[i][j] = Math.max(f[i][j], f[i + 1][j - 1] + 1);
t[i][j] = true;
}
}
}
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
res = Math.max(res, f[i][j]);
}
}
return res;
}
}
原理思路:
每个单元格只能从左上,左,左下过来,所以竖着遍历,然后取最大即可,当然要注意边界别越界,同时要记录必须是从第一列传递过来的,所以定义了一个t数组,如果是第一列走过来的才为true。
当然这题dfs也能写。
set记录每个可达节点,然后不断重复遍历,再更新set。