一、题目
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
示例 1:
输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。
示例 2:
输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。
示例 3:
输入:matrix = [[1]]
输出:1
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 200
- 0 <= matrix[i][j] <= 231 - 1
二、代码
class Solution {
public int longestIncreasingPath(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m][n];
int maxCnt = 0;
// 尝试从每一个位置开始,能找到的最长递增链
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
maxCnt = Math.max(maxCnt, process(i, j, matrix, dp));
}
}
return maxCnt;
}
// 从m[i][j]开始走,走出来的最长递增链,返回递增链的最长长度
public int process(int x, int y, int[][] matrix, int[][] dp) {
if (dp[x][y] != 0) {
return dp[x][y];
}
// 在每一次递归调用是,都要去判断不能越界
// 如果不是递增了,就直接返回0
int up = !(x - 1 < 0 || x - 1 >= matrix.length) && matrix[x][y] < matrix[x - 1][y] ? process(x - 1, y, matrix, dp) : 0;
int down = !(x + 1 < 0 || x + 1 >= matrix.length) && matrix[x][y] < matrix[x + 1][y] ? process(x + 1, y, matrix, dp) : 0;
int left = !(y - 1 < 0 || y - 1 >= matrix[0].length) && matrix[x][y] < matrix[x][y - 1] ? process(x, y - 1, matrix, dp) : 0;
int right = !(y + 1 < 0 || y + 1 >= matrix[0].length) && matrix[x][y] < matrix[x][y + 1] ? process(x, y + 1, matrix, dp) : 0;
dp[x][y] = Math.max(Math.max(up, down), Math.max(left, right)) + 1;
return dp[x][y];
}
}
三、解题思路
整体的思路就是尝试以每一个位置为开始点,看看能找到的最长递增链长度。就是注意在递归过程中判断不要越界即可,当发现不是递增了,就返回0。