给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
题解:
1.一个整数矩阵
2.找一个最长的递增路径
3.每次往上,下,左,右移动
4.返回这个路径的长度
示例 1:
输入: nums = [[9,9,4],[6,6,8], [2,1,1]]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]。
示例 2:
输入: nums = [[3,4,5],[3,2,6],[2,2,1]]
输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。
解题思路:
遍历数组中的每一个元素,这每一个元素都是一个递归种子入口
设置一个visited数组初始化为0,控制递归搜索的位置,同时记录可扩展的路径长度,这样为0为未访问过,不为0则记录的是路径长度不必再重复计算以该位置为种子的路径长度,直接返回它的值即可
这样每次计算路径长度时都会产生一个路径长度结果,设置一个结果变量记录比较记录较大值,即为最大值。
C/C++题解:
class Solution {
public:
int res = INT_MIN;
vector
int longestIncreasingPath(vector
if(matrix.size() == 0) return 0;
int m=matrix.size(), n = matrix[0].size();
vector
visited.resize(m,temp);
for (int i = 0;i for (int j = 0;j longestSearch(matrix,i,j); }}//每个元素位置都是一个种子 return res; } int longestSearch(vector if (visited[i][j] > 0) return visited[i][j]; visited[i][j] = 1; //位置访问过置1 int pathlen = 0;//计算长度 if (i-1>=0 && matrix[i-1][j] >matrix[i][j])//上一行判断下界 pathlen = max(pathlen,longestSearch(matrix,i-1,j)); if (i+1 pathlen = max(pathlen,longestSearch(matrix,i+1,j)); if (j-1 >= 0 && matrix[i][j-1] >matrix[i][j])//左一列判断下界 pathlen = max(pathlen,longestSearch(matrix,i,j-1)); if(j+1< matrix[i].size() && matrix[i][j+1] >matrix[i][j])//右一列判断上界 pathlen = max(pathlen,longestSearch(matrix,i,j+1)); res = max(res,pathlen + 1);//保留最大长度 visited[i][j] = pathlen+1; return pathlen + 1; }};//元素自身长度为1 Debug结果: Java题解: class Solution { public int res = Integer.MIN_VALUE; public int[][] visited; //设visited数组控制访问 public int longestIncreasingPath(int[][] matrix) { if (matrix.length == 0) return 0; int m = matrix.length,n = matrix[0].length; visited = new int[m][n]; for (int i = 0;i for (int j = 0;j longestSearch(matrix,i,j);}}//每个元素位置都是一个种子 return res;} public int longestSearch(int[][] matrix, int i,int j){ if (visited[i][j] > 0) return visited[i][j]; visited[i][j] = 1; //位置访问过置1 int pathlen = 0;//计算长度 if (i-1>=0 && matrix[i-1][j] >matrix[i][j])//上一行判断下界 pathlen = Math.max(pathlen,longestSearch(matrix,i-1,j)); if (i+1 pathlen = Math.max(pathlen,longestSearch(matrix,i+1,j)); if (j-1 >= 0 && matrix[i][j-1] >matrix[i][j])//左一列判断下界 pathlen = Math.max(pathlen,longestSearch(matrix,i,j-1)); if(j+1< matrix[i].length && matrix[i][j+1] >matrix[i][j])//右一列判断上界 pathlen = Math.max(pathlen,longestSearch(matrix,i,j+1)); res = Math.max(res,pathlen + 1);//保留最大长度 visited[i][j] = pathlen+1; return pathlen + 1;}}//元素自身长度为1 Debug结果: Python题解: class Solution(object): def longestIncreasingPath(self, matrix): """:type matrix: List[List[int]]:rtype: int""" if not matrix: return 0 self.res = -sys.maxint m, n = len(matrix), len(matrix[0]) visited = [[0 for _ in range(n)] for _ in range(m)] def longestSearch(matrix, i, j): if visited[i][j] > 0: return visited[i][j] visited[i][j] = 1 #位置访问过置1 pathlen = 0 #计算长度 if (i-1>=0 and matrix[i-1][j] > matrix[i][j]): #上一行判断下界 pathlen = max(pathlen,longestSearch(matrix,i-1,j)) if (i+1 < len(matrix) and matrix[i+1][j] >matrix[i][j]):#下一行判断上界 pathlen = max(pathlen,longestSearch(matrix,i+1,j)) if (j-1 >= 0 and matrix[i][j-1] >matrix[i][j]): #左一列判断下界 pathlen = max(pathlen,longestSearch(matrix,i,j-1)) if(j+1< len(matrix[i]) and matrix[i][j+1] >matrix[i][j]): #右一列判断上界 pathlen = max(pathlen,longestSearch(matrix,i,j+1)) self.res = max(self.res,pathlen + 1) #保留最大长度 visited[i][j] = pathlen+1 return pathlen + 1 #元素自身长度为1 for i in range(m): for j in range(n): longestSearch(matrix,i,j) #每个元素位置都是一个种子 return self.res Debug结果: 更多题解移步公众号免费获取