LeetCode:2684. 矩阵中移动的最大次数(DP Java)

目录

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。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cosmoshhhyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值