【发布时间】:2023-03-12 16:48:01
【问题描述】:
我遇到了一个问题,要在矩阵中找到最长的递增路径。蛮力解决方案非常简单:
public class Solution {
private static final int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
private int m, n;
public int longestIncreasingPath(int[][] matrix) {
if (matrix.length == 0) return 0;
m = matrix.length;
n = matrix[0].length;
int ans = 0;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
ans = Math.max(ans, dfs(matrix, i, j));
return ans;
}
private int dfs(int[][] matrix, int i, int j) {
int ans = 0;
for (int[] d : dirs) {
int x = i + d[0], y = j + d[1];
if (0 <= x && x < m && 0 <= y && y < n && matrix[x][y] > matrix[i][j])
ans = Math.max(ans, dfs(matrix, x, y));
}
return ++ans;
}
}
时间复杂度为O(2^(m+n)),其中 m 为否。行数,n 为否。矩阵中的列数。
我很难理解这一点。第一个嵌套的 for 循环是 O(mn),这很好。现在每个单元都被视为一个根,并对其进行 DFS。但是一个DFS的时间复杂度是O(V + E),这里是V = mn and E = 4*mn,所以每个dfs应该是O(mn),所以总的时间复杂度应该是O(mn) x O(mn) = O(m^2.n^2)吧?
注意:我知道这不是最佳解决方案,可以记住,但我的问题是关于理解这种粗暴方法的时间复杂度。
【问题讨论】:
标签: java time-complexity depth-first-search