题目
代码(8.24 首刷部分看解析)
一开始没有加memo,有3个案例的时间复杂度没通过。
class Solution {
public:
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int res = 1;
vector<vector<int>> memo;
int longestIncreasingPath(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
memo = vector<vector<int>>(m, vector<int>(n, 0));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++)
res = max(res, dfs(matrix, i, j, m, n));
}
return res;
}
int dfs(vector<vector<int> >& matrix, int& x, int& y, int& m, int& n) {
if(memo[x][y] != 0) return memo[x][y];
memo[x][y] = 1;
for(int i = 0; i < 4; i++) {
int nx = dx[i]+x, ny = dy[i]+y;
if(nx < 0 || ny < 0 || nx >= m || ny >= n || matrix[nx][ny] <= matrix[x][y]) continue;
memo[x][y] = max(memo[x][y], dfs(matrix, nx, ny, m, n)+1);
}
return memo[x][y];
}
};
代码(9.22 二刷优化看解析)
class Solution {
public:
vector<vector<int>> memo;
vector<vector<int>> dirs = {{1,0},{-1,0},{0,1},{0,-1}};
int ans = 1;
int longestIncreasingPath(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
memo = vector<vector<int>>(m, vector<int>(n, 0));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
ans = max(ans, dfs(matrix, i, j));
}
}
return ans;
}
int dfs(vector<vector<int>>& matrix, int x, int y) {
if(memo[x][y])
return memo[x][y];
memo[x][y] = 1;
int m = matrix.size(), n = matrix[0].size();
for(auto& dir : dirs) {
int nx = dir[0]+x, ny = dir[1]+y;
if(nx < 0 || ny < 0 || nx >= m || ny >= n || matrix[x][y] >= matrix[nx][ny]) continue;
memo[x][y] = max(dfs(matrix, nx, ny)+1, memo[x][y]);
}
return memo[x][y];
}
};