欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

0深度优先搜索中等 NC138 矩阵最长递增路径

程序员文章站 2022-05-20 16:45:47
...

NC138 矩阵最长递增路径

描述

给定一个矩阵,矩阵内所有数均为非负整数。
求一条路径,该路径上所有数是递增的。
这个路径必须满足以下条件:
1、对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
2、你不能走重复的单元格。即每个格子最多只能走一次。
示例1
输入:[[1,2,3],[4,5,6],[7,8,9]]。
返回值:5
说明:1->2->3->6->9即可。当然这种递增路径不是唯一的。

  • 最长路径可以从任意节点出发,所以需要便利所有的节点
  • 以某一节点出发,遍历这个节点的上下左右,当遇到比他更大的节点则递归遍历该节点,当所有的遍历结束,便可得到从该节点出发的最长路径长度。

代码:

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 递增路径的最大长度
     * @param matrix int整型二维数组 描述矩阵的每个数
     * @return int整型
     */
    public int solve (int[][] matrix) {
        // write code here
        if(matrix == null){
            return 0;
        }
        int max = 0;
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                max = Math.max(max,islandDFS(matrix,i,j,-2));
            }
        }
        return max;
    }

    public int islandDFS(int[][] arr, int a, int b, int pre){
    //遇到越界或比当前节点小的节点则返回0结束遍历
        if(a < 0 || a == arr.length || b < 0 || b == arr[0].length || arr[a][b] <= pre){
            return 0;
        }
        int max = islandDFS(arr,a+1,b,arr[a][b]);
        max = Math.max(max,islandDFS(arr,a-1,b,arr[a][b]));
        max = Math.max(max,islandDFS(arr,a,b+1,arr[a][b]));
        max = Math.max(max,islandDFS(arr,a,b-1,arr[a][b]));
        return max+1;
    }
}