Swim in Rising Water
Last updated
Last updated
class Solution {
int[][] grid;
int N;
public int swimInWater(int[][] grid) {
this.grid = grid;
this.N = grid.length;
int left = 0, right = 2500;
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (bfs(mid, new boolean[N][N])) {
right = mid;
} else {
left = mid;
}
}
if (bfs(left, new boolean[N][N])) {
return left;
} else {
return right;
}
}
private boolean bfs(int t, boolean[][] visited) {
if (grid[0][0] > t) {
return false;
}
int[] dr = new int[]{0, 1, 0, -1};
int[] dc = new int[]{1, 0, -1, 0};
visited[0][0] = true;
Deque<int[]> queue = new ArrayDeque<>();
queue.offerFirst(new int[]{0, 0});
while (!queue.isEmpty()) {
int[] curr = queue.pollLast();
if (curr[0] == N - 1 && curr[1] == N - 1) {
return true;
}
for (int i = 0; i < 4; ++i) {
int nr = curr[0] + dr[i];
int nc = curr[1] + dc[i];
if (isValid(nr, nc)) {
if (grid[nr][nc] <= t
&& !visited[nr][nc]
) {
visited[nr][nc] = true;
queue.offerFirst(new int[]{nr, nc});
}
}
}
}
return false;
}
private boolean isValid(int r, int c) {
return r >= 0 && r < N && c >= 0 && c < N;
}
}class Solution {
public int swimInWater(int[][] grid) {
int[] dr = new int[]{0, 1, 0, -1};
int[] dc = new int[]{1, 0, -1, 0};
int N = grid.length;
PriorityQueue<int[]> pq = new PriorityQueue<>(
(a, b)->Integer.compare(grid[a[0]][a[1]], grid[b[0]][b[1]]));
boolean[][] visited = new boolean[N][N];
int maxHeight = -1;
pq.offer(new int[]{0, 0});
while (!pq.isEmpty()) {
int[] curr = pq.poll();
maxHeight = Math.max(maxHeight, grid[curr[0]][curr[1]]);
if (curr[0] == N - 1 && curr[1] == N - 1) {
return maxHeight;
}
for (int i = 0; i < 4; ++i) {
int nr = curr[0] + dr[i];
int nc = curr[1] + dc[i];
if (isValid(nr, nc, grid) && !visited[nr][nc]) {
visited[nr][nc] = true;
pq.offer(new int[]{nr, nc});
}
}
}
return -1;
}
private boolean isValid(int r, int c, int[][] grid) {
return r >= 0 && r < grid.length && c >= 0 && c < grid.length;
}
}