【LeetCode】矩阵中的最长递增路径 [H](记忆化搜索)

166 篇文章 0 订阅

329. 矩阵中的最长递增路径 - 力扣(LeetCode)

一、题目

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

示例 1:

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4 
解释:最长递增路径为 [1, 2, 6, 9]。 

示例 2:

输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4 
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。 

示例 3:

输入:matrix = [[1]]
输出:1

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • 0 <= matrix[i][j] <= 231 - 1

二、代码

class Solution {
    public int longestIncreasingPath(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m][n];

        int maxCnt = 0;
        // 尝试从每一个位置开始,能找到的最长递增链
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                maxCnt = Math.max(maxCnt, process(i, j, matrix, dp));
            }
        }
        return maxCnt;
    }

    // 从m[i][j]开始走,走出来的最长递增链,返回递增链的最长长度
    public int process(int x, int y, int[][] matrix, int[][] dp) {
        if (dp[x][y] != 0) {
            return dp[x][y];
        }

        // 在每一次递归调用是,都要去判断不能越界
        // 如果不是递增了,就直接返回0
        int up = !(x - 1 < 0 || x - 1 >= matrix.length) && matrix[x][y] < matrix[x - 1][y] ? process(x - 1, y, matrix, dp) : 0;
        int down = !(x + 1 < 0 || x + 1 >= matrix.length) && matrix[x][y] < matrix[x + 1][y] ? process(x + 1, y, matrix, dp) : 0;
        int left = !(y - 1 < 0 || y - 1 >= matrix[0].length) && matrix[x][y] < matrix[x][y - 1] ? process(x, y - 1, matrix, dp) : 0;
        int right = !(y + 1 < 0 || y + 1 >= matrix[0].length) && matrix[x][y] < matrix[x][y + 1] ? process(x, y + 1, matrix, dp) : 0;

        dp[x][y] = Math.max(Math.max(up, down), Math.max(left, right)) + 1;

        return dp[x][y];
    }
}

三、解题思路 

整体的思路就是尝试以每一个位置为开始点,看看能找到的最长递增链长度。就是注意在递归过程中判断不要越界即可,当发现不是递增了,就返回0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值