leetcode 329. Longest Increasing Path in a Matrix
329. Longest Increasing Path in a Matrix
https://www.cnblogs.com/grandyang/p/5148030.html
这个题是在二维数组中找递增序列的最长长度。
因为使用dfs都是从当前位置进行搜索,所以每次dp计算的值是以当前为起点的最长长度。
这里使用了一个二维数组记录每个位置最长长度,在dfs递归的时候,同时也起到了之前visited数组的作用,只要这个位置的dp值不为0,就表示已经访问过了,可以直接返回数值。
还有这里的越界处理,即
if(x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size() || matrix[i][j] >= matrix[x][y])
continue;
不是像number of islands那样直接进入递归就判断,而是先变化坐标生成新的坐标判断新的坐标是否符合。number of islands两种方法都可以,但这个题只能使用这种方式,因为只有这种方式才能得到前后两个位置之间的数值关系,才能确保是递增的。
class Solution { public: int longestIncreasingPath(vector<vector<int>>& matrix) { int m = matrix.size(); if(m <= 0) return 0; int n = matrix[0].size(); if(n <= 0) return 0; vector<vector<int>> dp(m,vector<int>(n,0)); int res = 1; for(int i = 0;i < m;i++){ for(int j = 0;j < n;j++){ res = max(res,dfs(matrix,dp,i,j)); } } return res; } int dfs(vector<vector<int>>& matrix,vector<vector<int>>& dp,int i,int j){ if(dp[i][j]) return dp[i][j]; dp[i][j] = 1; int max_num = 1; for(auto dir : dirs){ int x = i + dir[0]; int y = j + dir[1]; if(x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size() || matrix[i][j] >= matrix[x][y]) continue; int length = 1 + dfs(matrix,dp,x,y); max_num = max(max_num,length); } dp[i][j] = max_num; return max_num; } private: vector<vector<int>> dirs{{-1,0},{1,0},{0,-1},{0,1}}; };