矩阵最长递增路径

题目

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

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

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

分析

1.当一个格子的值大于等于它周围所有格子的值时,以该格子为起点的最长递增路径的长度为1;
2.以格子A为起点的最长递增路径的长度 = 周围大于A的值的格子中最大的最长路径+1;
3.计算并记录二维数组中每个格子以自己为起点的最长递增路径的长度;
4.比较以每个格子为起点的最长路径的值,返回结果。

代码
class Solution {
     public int longestIncreasingPath(int[][] matrix) {
        int line = matrix.length;
        int column = matrix[0].length;
        int[][] greater = new int[line][column];//记录以当前格子为起点的最长递增路径的长度
        for (int i=0;i<line;i++){
            for(int j=0;j<column;j++){
                greater[i][j] = -1;//初始化数组
            }
        }
        int maxLength =0;//比较记录最大值,用来返回结果
        for (int i=0;i<line;i++){
            for(int j=0;j<column;j++){
                greater[i][j] = getGreater(matrix,i,j,line,column,greater);
                if(greater[i][j]>maxLength){
                    maxLength = greater[i][j];
                }
            }
        }
        return maxLength;
    }

    private int getGreater(int[][] matrix , int i, int j,int line, int column ,int[][] greater ){
        int up =0;
        int down =0;
        int left =0;
        int right = 0;
        if(greater[i][j]>=0){//如果该点已经计算过最长路径,直接返回结果
            return greater[i][j];
        }
        else {
            if(i-1>=0 && matrix[i][j]<matrix[i-1][j]){//上
                up = getGreater(matrix,i-1,j,line,column,greater);
                greater[i-1][j] =up;
            }
            if(i+1<line && matrix[i][j]<matrix[i+1][j]){//下
                down = getGreater(matrix,i+1,j,line,column,greater);
                greater[i+1][j] =down;
            }
            if (j-1>=0 && matrix[i][j]<matrix[i][j-1]){//左
                left = getGreater(matrix,i,j-1,line,column,greater);
                greater[i][j-1] =left;
            }
            if (j+1<column && matrix[i][j]<matrix[i][j+1]){//右
                right = getGreater(matrix,i,j+1,line,column,greater);
                greater[i][j+1] =right;
            }
        }
        return Math.max(Math.max(up,down),Math.max(left,right))+1;//返回结果:最大值+1
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵求最短路径的算法通常使用 Dijkstra 算法或 Floyd 算法。 1. Dijkstra 算法 Dijkstra 算法是一种单源最短路径算法,其基本思想是从源节点开始,不断扩展最短路径,直到到达目标节点为止。具体步骤如下: (1)初始化:将源节点 s 到所有节点的距离初始化为无穷大,将源节点 s 到自身的距离初始化为 0。 (2)遍历:从源节点 s 开始,按照距离从小到大的顺序遍历所有节点,并更新它们到源节点 s 的距离。 (3)更新:对于当前节点 u 的所有邻居节点 v,如果 u 到源节点 s 的距离加上 u 到 v 的距离小于当前已知的 v 到源节点 s 的距离,则更新 v 的距离。 (4)重复:重复步骤(2)和(3)直到遍历完所有节点或者找到目标节点。 C++ 代码实现: ```c++ const int INF = 0x3f3f3f3f; // 无穷大 int n; // 节点数 int G[MAX][MAX]; // 邻接矩阵 int d[MAX]; // s 到各点的距离 bool vis[MAX]; // 标记是否已确定最短距离 void Dijkstra(int s) { memset(vis, 0, sizeof(vis)); fill(d, d + n, INF); d[s] = 0; for (int i = 0; i < n; i++) { int u = -1; for (int j = 0; j < n; j++) { if (!vis[j] && (u == -1 || d[j] < d[u])) { u = j; } } vis[u] = true; for (int v = 0; v < n; v++) { if (!vis[v] && G[u][v] != INF && d[u] + G[u][v] < d[v]) { d[v] = d[u] + G[u][v]; } } } } ``` 2. Floyd 算法 Floyd 算法是一种多源最短路径算法,其基本思想是通过中间节点的遍历,不断缩小节点间的距离,直到得到最终的最短路径。具体步骤如下: (1)初始化:将邻接矩阵 G 初始化为节点间的距离。 (2)遍历:从节点 i 到节点 j 的最短路径可能经过节点 k,因此遍历所有可能的 k 值,更新 i 到 j 的最短路径。 C++ 代码实现: ```c++ const int INF = 0x3f3f3f3f; // 无穷大 int n; // 节点数 int G[MAX][MAX]; // 邻接矩阵 void Floyd() { for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { G[i][j] = min(G[i][j], G[i][k] + G[k][j]); } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值