一、题目描述
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
二、理解题意
问题建模
- 将矩阵中每个元素当成一个节点,连接上下左右相邻的元素,我们可以得到一个图
- 由于题目要求寻找最长递增路径,我们可以只保留从小元素指向大元素的有向边
- 那么该问题也就变成了寻找有向图中的最长路径
- 由于该图中的邻接关系是固定的,我们并不用显式构建邻接表或邻接矩阵,直接使用该矩阵即可
三、解法一:深度优先遍历法
public int[][] dirs = {
{
-1, 0}, {
1, 0}, {
0, -1}, {
0, 1}};
public int rows, columns;
public int dfs(int[][] matrix, int row, int column) {
int result = 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])
result = Math.max(result, dfs(matrix, newRow, newColumn) + 1);
}
return result;
}
public int longestIncreasingPath(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0