最后更新

三刷?

找矩阵里的最长路径。

看起来是DFS,实际上也就是。但是如果从每个点都进行一次DFS然后保留最大的话,会超时。

这里需要结合DP,dp[i][j]表示以此点开始的最长路径,这样每次碰到的时候,如果已经算过,可以直接调取这个值。

用空间交换了部分时间。

写的时候我吸取教训,把边界判断放在DFS的开始。。

Time Complexity: 不会算。。 O(4mn)?因为只能单方向= =,每个点往一个方向延伸,就不可能回来。

Space : O(m*n)

  1. public class Solution {
  2. public int longestIncreasingPath(int[][] matrix) {
  3. if (matrix.length == 0) return 0;
  4. int row = matrix.length;
  5. int col = matrix[0].length;
  6. int[][] dp = new int[row][col];
  7. int res = 0;
  8. for (int i = 0; i < row; i++) {
  9. for (int j = 0; j < col; j++) {
  10. res = Math.max(res, dfs(i, j, matrix, dp, Integer.MIN_VALUE));
  11. }
  12. }
  13. return res;
  14. }
  15. public int dfs(int i, int j, int[][] matrix, int[][] dp, int prev) {
  16. if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length) return 0;
  17. if (matrix[i][j] <= prev) return 0;
  18. if (dp[i][j] != 0) return dp[i][j];
  19. int temp = matrix[i][j];
  20. int tempMax = 0;
  21. tempMax = Math.max(tempMax, dfs(i+1, j, matrix, dp, temp));
  22. tempMax = Math.max(tempMax, dfs(i, j+1, matrix, dp, temp));
  23. tempMax = Math.max(tempMax, dfs(i-1, j, matrix, dp, temp));
  24. tempMax = Math.max(tempMax, dfs(i, j-1, matrix, dp, temp));
  25. dp[i][j] = tempMax + 1;
  26. return dp[i][j];
  27. }
  28. }

一刷

一看是H难度的就害怕了,以为有什么特别的办法,动态规划之类的,结果是DFS。。。那就没啥难度了。。

甚至连VISIT都不用,因为一次遍历只可能越来越大。。不可能出现unvisited but goable的情况。。

DP记录下每个格的最大距离,避免重复计算就行了。

代码可以更简单,有些中间变量可以胜率,不过那样一行太长了。。

  1. public class Solution
  2. {
  3. public int longestIncreasingPath(int[][] matrix)
  4. {
  5. if(matrix.length == 0) return 0;
  6. int[][] dp = new int[matrix.length][matrix[0].length];
  7. int res = 0;
  8. for(int i = 0; i < dp.length;i++)
  9. {
  10. for(int j = 0; j < dp[0].length;j++)
  11. {
  12. if(dp[i][j] == 0)
  13. {
  14. dp[i][j] = helper(matrix,dp,i,j)+1;
  15. }
  16. res = Math.max(res,dp[i][j]);
  17. }
  18. }
  19. return res;
  20. }
  21. public int helper(int[][] matrix, int[][] dp, int m, int n)
  22. {
  23. if(dp[m][n] != 0) return dp[m][n];
  24. int res = 0;
  25. int temp = matrix[m][n];
  26. if(m > 0 && matrix[m-1][n] > temp)
  27. {
  28. if(dp[m-1][n] == 0) dp[m-1][n] = helper(matrix,dp,m-1,n) + 1;
  29. res = Math.max(res,dp[m-1][n]);
  30. }
  31. if(n > 0 && matrix[m][n-1] > temp)
  32. {
  33. if(dp[m][n-1] == 0) dp[m][n-1] = helper(matrix,dp,m,n-1) + 1;
  34. res = Math.max(res,dp[m][n-1]);
  35. }
  36. if(m+1 < dp.length && matrix[m+1][n] > temp)
  37. {
  38. if(dp[m+1][n] == 0) dp[m+1][n] = helper(matrix,dp,m+1,n) + 1;
  39. res = Math.max(res,dp[m+1][n]);
  40. }
  41. if(n+1 < dp[0].length && matrix[m][n+1] > temp)
  42. {
  43. if(dp[m][n+1] == 0) dp[m][n+1] = helper(matrix,dp,m,n+1) + 1;
  44. res = Math.max(res,dp[m][n+1]);
  45. }
  46. dp[m][n] = res;
  47. return dp[m][n];
  48. }
  49. }

今天晕晕乎乎的,这个题做得也不好。

DFS+DPmemory

要注意什么时候更新dp[i][j]

  1. public class Solution {
  2. public int longestIncreasingPath(int[][] matrix) {
  3. if (matrix.length == 0) return 0;
  4. int[][] dp = new int[matrix.length][matrix[0].length];
  5. int res = 0;
  6. for (int i = 0; i < matrix.length; i++) {
  7. for (int j = 0; j < matrix[0].length; j++) {
  8. if (dp[i][j] == 0) {
  9. dp[i][j] = dfs(matrix, i, j, dp) + 1;
  10. }
  11. res = Math.max(res, dp[i][j]);
  12. }
  13. }
  14. return res;
  15. }
  16. public int dfs(int[][] matrix, int m, int n, int[][] dp) {
  17. int temp = matrix[m][n];
  18. int res = 0;
  19. if (m < matrix.length - 1 && temp < matrix[m+1][n]) {
  20. if (dp[m+1][n] == 0) {
  21. dp[m+1][n] = dfs(matrix, m+1, n, dp) + 1;
  22. }
  23. res = Math.max(res, dp[m+1][n]);
  24. }
  25. if (n < matrix[0].length - 1 && temp < matrix[m][n+1]) {
  26. if (dp[m][n+1] == 0) {
  27. dp[m][n+1] = dfs(matrix, m, n+1, dp) + 1;
  28. }
  29. res = Math.max(res, dp[m][n+1]);
  30. }
  31. if (m > 0 && temp < matrix[m-1][n]) {
  32. if (dp[m-1][n] == 0) {
  33. dp[m-1][n] = dfs(matrix, m-1, n, dp) + 1;
  34. }
  35. res = Math.max(res, dp[m-1][n]);
  36. }
  37. if (n > 0 && temp < matrix[m][n-1]) {
  38. if (dp[m][n-1] == 0) {
  39. dp[m][n-1] = dfs(matrix, m, n-1, dp) + 1;
  40. }
  41. res = Math.max(res, dp[m][n-1]);
  42. }
  43. dp[m][n] = res;
  44. return res;
  45. }
  46. }

329. Longest Increasing Path in a Matrix的更多相关文章

  1. LeetCode #329. Longest Increasing Path in a Matrix

    题目 Given an integer matrix, find the length of the longest increasing path. From each cell, you can ...

  2. leetcode@ [329] Longest Increasing Path in a Matrix (DFS + 记忆化搜索)

    https://leetcode.com/problems/longest-increasing-path-in-a-matrix/ Given an integer matrix, find the ...

  3. [LeetCode] 329. Longest Increasing Path in a Matrix ☆☆☆

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  4. 329 Longest Increasing Path in a Matrix 矩阵中的最长递增路径

    Given an integer matrix, find the length of the longest increasing path.From each cell, you can eith ...

  5. 329. Longest Increasing Path in a Matrix(核心在于缓存遍历过程中的中间结果)

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  6. 【LeetCode】329. Longest Increasing Path in a Matrix 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/longest- ...

  7. [leetcode] 329. Longest Increasing Path in a Matrix My Submissions Question

    在递归调用的函数中使用了max = INT_MIN,结果报超时错误,改为max=0就对了,虽然在这题中最小就为0, 看来在之后最小为0的时候,就不要使用INT_MIN了.

  8. Leetcode之深度优先搜索(DFS)专题-329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix)

    Leetcode之深度优先搜索(DFS)专题-329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix) 深度优先搜索的解题详细介绍,点击 给定一个整数矩 ...

  9. Longest Increasing Path in a Matrix -- LeetCode 329

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

随机推荐

  1. var t = a&&b;的问题

    var a = "avalue";var b = "bvalue";var t = a&&b;console.info(t); // bvalu ...

  2. 在ios开发中有多少常用的加密解密方式(备用)

    最常用的是MD5和base64编码,还有DES 3DES AES加密 ios怎么实现RAS加密解密 最近几天折腾了一下如何在iOS上使用RSA来加密.iOS上并没有直接的RSA加密API.但是iOS提 ...

  3. C#方法定义和调用-2

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  4. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  5. Lea指令计算地址(用于四则混合运算),附上一个函数调用例子及其反汇编代码,很清楚

    比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:     push   ebp     mov   esp,   ebp     sub ...

  6. 《深入理解linux内核架构》第二章 进程管理和调度

    2.1进程优先级 进程优先级 硬实时进程 软实时进程 抢占式多任务处理 2.2进程生命周期 用户太切换到核心态的办法 系统调用 中断 抢占调度模型优先级普通进程<系统调用<中断 普通进程可 ...

  7. C#程序集使用强名字(Strong Name)签名/强名称签名

    强名称签名的方法: 强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的 ...

  8. git图示所有分支的历史

    1.第一种方法 git gui 菜单栏上 repository-->visual all branch history 或者直接使用命令gitk --all 2.在git bash中,使用命令查 ...

  9. bzoj1449

    竞赛图一般是把每场比赛当作一个点,然后和相应球队连边每场比赛一赢一输对两支球队都有影响看起来不好搞实际上我们可以先假设参加后面后面所有球队都输(每场比赛双输)然后对每场比赛我们选择一支球队赢计算增加的 ...

  10. [DP] LCS小结

    额..失误.. LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. DP.O ...