题解 | #矩阵最长递增路径#

矩阵最长递增路径

https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2

如何用递归搜索最大路径?

最大路径的起点并不知道,因此我们需要遍历矩阵中的每个元素为起点,然后递归寻找这个起点开始的最大路径长度。

如何保证路径中的单元格不重复?

  • 由于路径的单元格不能重复,我们需要一个dp数组保存矩阵中每个元素为起点的最大路径长度。
  • 如果矩阵中的某个单元格没有更新最大路径长度,我们就增加一更新这个单元格的路径长度,表示这个单元格访问过了。
  • 后面会再从上下左右四个方向更新这个单元格出发的最大路径长度,而且后面单元格的路径长度也会使用到前面单元格的路径长度来更新。

感想

此题跟岛屿数量 思路类似,都是用深度优先遍历来搜索二维矩阵中的所有元素来得到最终结果。即先遍历矩阵中的每个元素,然后以这个元素为起点来对各个方向深度遍历,找到这个元素的答案,深度递归过程中要注意不要超过数组的边界。

参考

https://blog.nowcoder.net/n/cc034a49cd994552a671ec4d26ec2163?f=comment

/*
 * @Author: LibraStalker **********
 * @Date: 2023-04-21 10:01:54
 * @FilePath: BM61-矩阵最长递增路径.js
 * @Description: 
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 递增路径的最大长度
 * @param matrix int整型二维数组 描述矩阵的每个数
 * @return int整型
 */
function solve( matrix ) {
    // write code here
    let maxPath = -Infinity;
    const n = matrix.length;
    const m = matrix[0].length;
    const dp = Array.from(new Array(n), () => new Array(m).fill(0));  // 存放矩阵中以某个元素为起点时的最大路径长度
    const direction = [[-1, 0], [1, 0], [0, -1], [0, 1]];  // 上下左右4个方向
    const _dfs = (i, j, matrix, dp) => {
        if (dp[i][j] !== 0) {
            return dp[i][j];  // 说明当前的格子已经走过了,可以直接用这个格子保存好的最大路径
        }

        dp[i][j]++;  // 初始增加1,表示这个单元格访问过了,后面会更新最大长度

        for (let k = 0; k < 4; ++k) {
            const nextI = i + direction[k][0];
            const nextJ = j + direction[k][1];

            if (nextI >= 0 && nextI < n && nextJ >= 0 && nextJ < m && matrix[i][j] < matrix[nextI][nextJ]) {
                dp[i][j] = Math.max(dp[i][j], _dfs(nextI, nextJ, matrix, dp)+1);  // 更新4个方向的路径中的最大路径长度
            }
        }

        return dp[i][j];
    }

    for (let i = 0; i < n; ++i) {
        for (let j = 0; j < m; ++j) {
            maxPath = Math.max(maxPath, _dfs(i, j, matrix, dp));
        }
    }

    return maxPath;
}

module.exports = {
    solve : solve
};

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务