力扣刷题日记-329. 矩阵中的最长递增路径

195 阅读1分钟

思路: 动态规划,当前的长度算1,化繁为简,递归下去

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)

来源:力扣(LeetCode) 链接:leetcode.cn/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int longestIncreasingPath(int[][] matrix) {
        int ans = 0;
        int N = matrix.length;
        int M = matrix[0].length;
        int[][] dp = new int[N][M];


        for(int i = 0; i< N; i++) {
            for(int j = 0; j<M; j++) {
                ans = Math.max(ans, process(matrix,i,j,dp));
            }
        }
        return ans;
    }
    // 从m[i][j]开始走, 走出来的最长递增链, 返回
    public static int process(int[][] m,int i, int j,int[][] dp) {
        if(dp[i][j] != 0) {
            return dp[i][j];
        };
        // if(i < 0 || i == m.length || j < 0 || j == m[0].length) {
        //     return 0;
        // }
        // (i,j)不越界的情况下
        int up = i > 0 && m[i][j] < m[i - 1][j] ? process(m,i-1,j,dp):0;
        int down = i < (m.length - 1) && m[i][j] < m[i+1][j] ? process(m,i+1,j,dp) : 0;
        int left = j > 0 && m[i][j] < m[i][j - 1] ? process(m,i,j -1,dp): 0;
        int right = j < (m[0].length - 1) && m[i][j] < m[i][j+1] ? process(m,i,j+1,dp) : 0;
        int ans = Math.max(Math.max(up,down),Math.max(left,right)) + 1;
        dp[i][j] = ans;
        return ans;
    }
}