这题是经典 二分答案 + DFS/BFS,也可以用 并查集/最小堆。我给你最稳、最好写、面试必过的 二分 + DFS 版 Java 代码,直接提交能过。

LeetCode 778 标准 Java 代码

java

class Solution {
public int swimInWater(int[][] grid) {
int n = grid.length;
int left = 0;
int right = n * n - 1;
int ans = 0;

    // 二分答案:最少需要多大的高度 t 才能从 (0,0) 到 (n-1,n-1)
    while (left <= right) {
        int mid = left + (right - left) / 2;
        boolean[][] visited = new boolean[n][n];
        if (dfs(grid, 0, 0, mid, visited, n)) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
}

// 判断在高度 limit 下,能否从 (x,y) 走到终点
private boolean dfs(int[][] grid, int x, int y, int limit, boolean[][] visited, int n) {
    // 越界、已访问、当前高度 > limit 都不行
    if (x < 0 || x >= n || y < 0 || y >= n || visited[x][y] || grid[x][y] > limit) {
        return false;
    }
    // 到达终点
    if (x == n - 1 && y == n - 1) {
        return true;
    }
    visited[x][y] = true;

    // 上下左右
    int[] dx = {-1, 1, 0, 0};
    int[] dy = {0, 0, -1, 1};

    for (int d = 0; d < 4; d++) {
        int nx = x + dx[d];
        int ny = y + dy[d];
        if (dfs(grid, nx, ny, limit, visited, n)) {
            return true;
        }
    }
    return false;
}

}

核心思路(一句话)

  • 水位高度就是答案,我们用二分猜这个高度。
  • 对每个猜测值  mid ,用 DFS/BFS 看能不能从左上角走到右下角。
  • 能走通就尝试更小高度,不能就提高高度。

时间复杂度

  • 二分:O(\log(n^2)) \approx O(2\log n)
  • 每次 DFS:O(n^2)
  • 总:O(n^2 \log n),n \le 50 完全稳过。

需要我再给你 BFS 版本 或者 最小堆(Dijkstra)版本 吗?

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐