豆包 LeetCode 778.水位上升中的泳池游泳 public int swimInWater(int[][] grid)
这题是经典 二分答案 + DFS/BFS,也可以用 并查集/最小堆。我给你最稳、最好写、面试必过的 二分 + DFS 版 Java 代码,直接提交能过。需要我再给你 BFS 版本 或者 最小堆(Dijkstra)版本 吗?LeetCode 778 标准 Java 代码。
·
这题是经典 二分答案 + 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)版本 吗?
更多推荐




所有评论(0)