329. Longest Increasing Path in a Matrix

建立一个二维的表,每一个格子的值,都是以此位置为结尾的最长的增序序列。所以这个值需要上下左右四个值来确定,就是一个dfs。

需要注意的是,如果已经被算出结果的值不需要再算一遍。

 

所以整个dfs的结构是,算出上下左右的值,找到最大的那个,当前值是四周比它小的最长序列的长度+1,否则为1

 1     private static final int[][] directions = {{0,1},{0,-1},{-1,0},{1,0}};
 2     
 3     public int longestIncreasingPath(int[][] matrix) {
 4         if(matrix.length == 0 || matrix[0].length == 0) {
 5             return 0;
 6         }
 7         int row = matrix.length;
 8         int col = matrix[0].length;
 9         int[][] res = new int[row][col];
10         int max = 1;
11         for(int i = 0; i < row; i++) {
12             for(int j = 0; j < col; j++) {
13                 if (res[i][j] == 0) {
14                     max = Math.max(max, dfs(matrix, res, i, j));
15                 }
16             }
17         }
18         return max;
19     }
20     
21     private int dfs(int[][] matrix, int[][] res, int x, int y) {
22         if(res[x][y] != 0) {
23             return res[x][y];
24         }
25         int max = 1;
26         for (int[] direction : directions) {
27             int newX = x + direction[0];
28             int newY = y + direction[1];
29             if (newX < 0 || newX >= matrix.length || newY < 0 || newY >= matrix[0].length) {
30                 continue;
31             }
32             if (matrix[newX][newY] < matrix[x][y]) {
33                 max = Math.max(max, 1 + dfs(matrix, res, newX, newY));
34             }
35         }
36         res[x][y] = max;
37         return max;
38     }

 

posted @ 2016-07-07 07:04  warmland  阅读(395)  评论(0编辑  收藏  举报