【問題描述】[中等]
【解答思路】
1. 記憶化深度優先搜索
復雜度
class Solution {public int[][] dirs
= {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows
, columns
;public int longestIncreasingPath(int[][] matrix
) {if (matrix
== null
|| matrix
.length
== 0 || matrix
[0].length
== 0) {return 0;}rows
= matrix
.length
;columns
= matrix
[0].length
;int[][] memo
= new int[rows
][columns
];int ans
= 0;for (int i
= 0; i
< rows
; ++i
) {for (int j
= 0; j
< columns
; ++j
) {ans
= Math
.max(ans
, dfs(matrix
, i
, j
, memo
));}}return ans
;}public int dfs(int[][] matrix
, int row
, int column
, int[][] memo
) {if (memo
[row
][column
] != 0) {return memo
[row
][column
];}++memo
[row
][column
];for (int[] dir
: dirs
) {int newRow
= row
+ dir
[0], newColumn
= column
+ dir
[1];if (newRow
>= 0 && newRow
< rows
&& newColumn
>= 0 && newColumn
< columns
&& matrix
[newRow
][newColumn
] > matrix
[row
][column
]) {memo
[row
][column
] = Math
.max(memo
[row
][column
], dfs(matrix
, newRow
, newColumn
, memo
) + 1);}}return memo
[row
][column
];}
}
2. 拓撲排序
復雜度
class Solution {public int[][] dirs
= {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows
, columns
;public int longestIncreasingPath(int[][] matrix
) {if (matrix
== null
|| matrix
.length
== 0 || matrix
[0].length
== 0) {return 0;}rows
= matrix
.length
;columns
= matrix
[0].length
;int[][] outdegrees
= new int[rows
][columns
];for (int i
= 0; i
< rows
; ++i
) {for (int j
= 0; j
< columns
; ++j
) {for (int[] dir
: dirs
) {int newRow
= i
+ dir
[0], newColumn
= j
+ dir
[1];if (newRow
>= 0 && newRow
< rows
&& newColumn
>= 0 && newColumn
< columns
&& matrix
[newRow
][newColumn
] > matrix
[i
][j
]) {++outdegrees
[i
][j
];}}}}Queue
<int[]> queue
= new LinkedList<int[]>();for (int i
= 0; i
< rows
; ++i
) {for (int j
= 0; j
< columns
; ++j
) {if (outdegrees
[i
][j
] == 0) {queue
.offer(new int[]{i
, j
});}}}int ans
= 0;while (!queue
.isEmpty()) {++ans
;int size
= queue
.size();for (int i
= 0; i
< size
; ++i
) {int[] cell
= queue
.poll();int row
= cell
[0], column
= cell
[1];for (int[] dir
: dirs
) {int newRow
= row
+ dir
[0], newColumn
= column
+ dir
[1];if (newRow
>= 0 && newRow
< rows
&& newColumn
>= 0 && newColumn
< columns
&& matrix
[newRow
][newColumn
] < matrix
[row
][column
]) {--outdegrees
[newRow
][newColumn
];if (outdegrees
[newRow
][newColumn
] == 0) {queue
.offer(new int[]{newRow
, newColumn
});}}}}}return ans
;}
}
【總結】
1. 拓撲排序模板
定邊界 - 入隊 - 出隊 層數即為答案
2.dfs 記憶化搜索 避免超時
轉載鏈接:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/solution/ju-zhen-zhong-de-zui-chang-di-zeng-lu-jing-by-le-2/
總結
以上是生活随笔為你收集整理的[Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。