Given an integer matrix, find the length of the longest increasing path.
From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).
Example 1:
nums = [ [9,9,4], [6,6,8], [2,1,1] ]
Return 4
The longest increasing path is [1, 2, 6, 9]
.
Example 2:
nums = [ [3,4,5], [3,2,6], [2,2,1] ]
Return 4
The longest increasing path is [3, 4, 5, 6]
. Moving diagonally is not allowed.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
class Solution {
int dfs (vector<vector<int>> &matrix, int x, int y, map<pair<int, int>, int> &hashtable) {
int val = matrix[x][y];
pair<int, int> curPair(x, y);
if (hashtable.find(curPair) != hashtable.end())
return hashtable[curPair];
int rows[] = {0, -1, 0, 1};
int colum[] = {-1, 0, 1, 0};
int ret = 1;
for (int i=0; i<4; i++)
{
int xx = x+rows[i];
int yy = y+colum[i];
if ((xx>=0 && xx<matrix.size()) && (yy>=0 && yy<matrix[0].size()) && matrix[xx][yy]>val)
{
ret = max(ret, 1+dfs(matrix, xx, yy, hashtable));
}
}
hashtable[curPair] = ret;
return ret;
}
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0)
return 0;
vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size()));
pair<int, int> position;
map<pair<int, int>, int> hashtable;
int maxRet = INT_MIN;
for (int i=0; i<matrix.size(); i++)
{
for (int j=0; j<matrix[0].size(); j++)
{
maxRet = max(maxRet, dfs(matrix, i, j, hashtable));
}
}
return maxRet;
}
};