📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
文章目录
- 牛客热题:矩阵最长递增路径
- 题目链接
- 方法一:DFS
- 思路
- 代码
- 复杂度
- 时间复杂度:
- 空间复杂度:
- 方法二:优化--- 一个位置只递归一次
- 思路
- 代码
- 复杂度
- 时间复杂度:
- 空间复杂度:
牛客热题:矩阵最长递增路径
题目链接
矩阵最长递增路径_牛客题霸_牛客网 (nowcoder.com)
方法一:DFS
思路
dfs
:以(x, y)为起点进行递归:
对于每个(x, y)来说,遍历它上下左右四个坐标,查看是否越界或者满足递增的要求;
若是满足要求就继续递归满足要求的点
slove
: 两重循环遍历矩阵中所有的点
代码
void dfs(vector<vector<int>>& matrix, vector<vector<int>>& st, int count, int x, int y, int& res)
{
array<int, 4> dx = {-1, 0, 1, 0};
array<int, 4> dy = {0, 1, 0, -1};
int n = st.size();
int m = st[0].size();
for(int i = 0; i < 4; ++i)
{
int X = x + dx[i], Y = y + dy[i];
if(X < 0 || X >= n || Y < 0 || Y >= m)
continue;
if(st[X][Y] == 0 && matrix[X][Y] > matrix[x][y])
{
st[X][Y] = 1;
dfs(matrix, st, count + 1, X, Y, res);
st[X][Y] = 0;
}
}
res = max(res, count);
}
int solve(vector<vector<int> >& matrix)
{
int n = matrix.size();
int m = matrix[0].size();
int res = 1;
vector<vector<int>> st(n, vector<int>(m));
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
dfs(matrix, st, 1, i, j, res);
return res;
}
复杂度
时间复杂度:
dfs的时间复杂度为O(m * n), 主函数调用了m * n次,所以总体的时间复杂度是O( ( m ∗ n ) 2 (m * n) ^ 2 (m∗n)2)
空间复杂度:
创建了一个和原矩阵空间大小相同的矩阵用于判断当前的左边是否被递归过,以及一些变量。
所以总体上来说空间复杂度:O(n * m);
方法二:优化— 一个位置只递归一次
思路
- 动态规划缓存:
dp
矩阵用来缓存已经计算过的路径长度,避免重复计算。 - 减少递归调用: 通过在每个位置初始化时只调用一次 DFS,减少了不必要的递归调用。
- 简化函数参数: 去掉了
st
矩阵和count
参数,将dp
矩阵用作缓存,count
的功能由dp[x][y]
代替。
代码
class Solution {
public:
void dfs(const vector<vector<int>>& matrix, vector<vector<int>>& dp, int x, int y, int& res) {
array<int, 4> dx = {-1, 0, 1, 0};
array<int, 4> dy = {0, 1, 0, -1};
int n = matrix.size();
int m = matrix[0].size();
for (int i = 0; i < 4; ++i) {
int X = x + dx[i], Y = y + dy[i];
if (X < 0 || X >= n || Y < 0 || Y >= m || matrix[X][Y] <= matrix[x][y]) {
continue;
}
if (dp[X][Y] == 0) {
dfs(matrix, dp, X, Y, res);
}
dp[x][y] = max(dp[x][y], 1 + dp[X][Y]);
}
res = max(res, dp[x][y]);
}
int solve(vector<vector<int>>& matrix) {
int n = matrix.size();
if (n == 0) return 0;
int m = matrix[0].size();
vector<vector<int>> dp(n, vector<int>(m, 0));
int res = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (dp[i][j] == 0) {
dp[i][j] = 1;
dfs(matrix, dp, i, j, res);
}
}
}
return res;
}
};
复杂度
时间复杂度:
相当于遍历一遍对应的矩阵O(n * m)
空间复杂度:
创建了一个和原矩阵同等空间的dp数组,则空间复杂度为O(n * m)