【Dijkstra】
class Solution {
int[][] grid, dist;
int m, n, inf = 100000;
int[] dx = new int[] {0, 0, 1, -1};
int[] dy = new int[] {1, -1, 0, 0};
PriorityQueue<int[]> queue = new PriorityQueue<int[]> ((a, b) -> a[0] - b[0]);
void dijkstra() {
dist[0][0] = grid[0][0];
queue.offer(new int[] {dist[0][0], 0, 0});
while (!queue.isEmpty()) {
int[] t = queue.poll();
int d = t[0], x = t[1], y = t[2];
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < m && ny >= 0 && ny < n) {
int tmp = Math.max(d, grid[nx][ny]);
if (dist[nx][ny] > tmp) {
dist[nx][ny] = tmp;
queue.offer(new int[] {tmp, nx, ny});
}
}
}
}
}
public int swimInWater(int[][] grid) {
this.grid = grid;
m = grid.length; n = grid[0].length;
dist = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dist[i][j] = inf;
}
}
dijkstra();
return dist[m - 1][n - 1];
}
}
【二分+BFS】
class Solution {
int[][] grid;
boolean[][] st;
int m, n;
int[] dx = new int[] {0, 0, 1, -1};
int[] dy = new int[] {1, -1, 0, 0};
boolean check(int p) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) st[i][j] = false;
}
if (p < grid[m - 1][n - 1]) return false;
LinkedList<int[]> queue = new LinkedList();
queue.offer(new int[] {m - 1, n - 1});
st[m - 1][n - 1] = true;
while (!queue.isEmpty()) {
int[] t = queue.poll();
int x = t[0], y = t[1];
if (x == 0 && y == 0) return true;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && !st[nx][ny] && grid[nx][ny] <= p) {
queue.offer(new int[] {nx, ny});
st[nx][ny] = true;
}
}
}
return false;
}
public int swimInWater(int[][] grid) {
this.grid = grid;
m = grid.length; n = grid[0].length;
st = new boolean[m][n];
int l = 0, r = 2500;
while (l <= r) {
int p = (l + r) >> 1;
if (!check(p)) l = p + 1;
else r = p - 1;
}
return l;
}
}