329. 矩阵中的最长递增路径

nice,有进步了,这是一道hard题目,而我自己写的,过了135/138个测试用例,没过的纯粹是因为超时了

题目

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

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

示例 1:

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

代码与解析

我一开始写的代码超时了,需要记录重复走过的地方,但是当我记录的时候用了布尔数组发现一点作用都没起到:

java 复制代码
class Solution {
    int n, m, ans = 0;
    boolean[][] state;
    public int longestIncreasingPath(int[][] matrix) {
        m = matrix.length;
        n = matrix[0].length;
        state = new boolean[m + 10][n + 10];
        for(int i = 0;i < m;i ++) {
            for(int j = 0;j < n;j ++) {
                dfs(matrix, i, j, 0);
            }
        }
        return ans;
    }
    public void dfs(int[][] matrix, int x, int y, int nums) {
        if(!notArea(x, y))   return;
        nums ++;
        ans = Math.max(ans, nums);
        if(notArea(x + 1, y) && matrix[x + 1][y] > matrix[x][y]) dfs(matrix, x + 1, y, nums);
        if(notArea(x - 1, y) && matrix[x - 1][y] > matrix[x][y]) dfs(matrix, x - 1, y, nums);
        if(notArea(x, y + 1) && matrix[x][y + 1] > matrix[x][y]) dfs(matrix, x, y + 1, nums);
        if(notArea(x, y - 1) && matrix[x][y - 1] > matrix[x][y]) dfs(matrix, x, y - 1, nums);

    }
    public boolean notArea(int x, int y) {
        if(x < 0 || y < 0 || x >= m || y >= n) return false;
        return true;
    }
}

然后问了下chatgpt如何优化我的代码,它提出了采用记忆化搜索的方式,记录已经访问过的位置的最长递增路径长度,记忆数组memo

java 复制代码
class Solution {
    int m, n;
    int[][] memo; // 记忆数组

    public int longestIncreasingPath(int[][] matrix) {
        m = matrix.length;
        n = matrix[0].length;
        memo = new int[m][n];
        int ans = 0;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ans = Math.max(ans, dfs(matrix, i, j, Integer.MIN_VALUE)); // 对每个点进行深度优先搜索
            }
        }

        return ans;
    }

    public int dfs(int[][] matrix, int x, int y, int prev) {
        if (x < 0 || y < 0 || x >= m || y >= n || matrix[x][y] <= prev) {
            return 0; // 超出边界或者不满足递增条件,返回长度为0
        }
        if (memo[x][y] != 0) {
            return memo[x][y]; // 如果已经计算过该位置,直接返回其结果
        }

        int cur = matrix[x][y]; // 当前位置的值
        int pathLen = 0; // 记录当前路径的长度

        // 搜索当前位置的上下左右节点
        pathLen = Math.max(pathLen, dfs(matrix, x + 1, y, cur));
        pathLen = Math.max(pathLen, dfs(matrix, x - 1, y, cur));
        pathLen = Math.max(pathLen, dfs(matrix, x, y + 1, cur));
        pathLen = Math.max(pathLen, dfs(matrix, x, y - 1, cur));

        memo[x][y] = pathLen + 1; // 记录当前位置的最长递增路径长度
        return pathLen + 1;
    }
}

在深度优先搜索时,如果遇到已经计算过的位置,则直接返回其结果,避免了重复计算。这种方式可以避免超时情况,提高了效率。

相关推荐
一 乐1 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
码事漫谈2 小时前
Protocol Buffers 编码原理深度解析
后端
码事漫谈2 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
踏浪无痕4 小时前
AI 时代架构师如何有效成长?
人工智能·后端·架构
程序员小假4 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
武子康5 小时前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习
maozexijr5 小时前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby
源码获取_wx:Fegn08955 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
独断万古他化6 小时前
【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略
java·后端·spring·java-ee
毕设源码_郑学姐6 小时前
计算机毕业设计springboot基于HTML5的酒店预订管理系统 基于Spring Boot框架的HTML5酒店预订管理平台设计与实现 HTML5与Spring Boot技术驱动的酒店预订管理系统开
spring boot·后端·课程设计