778. Swim in Rising Water
阿新 • • 發佈:2018-02-08
blog example cat point each color () depth higher . You can swim infinite distance in zero time. Of course, you must stay within the boundaries of the grid during your swim.
On an N x N grid
, each square grid[i][j]
represents the elevation at that point (i,j)
.
Now rain starts to fall. At time t
, the depth of the water everywhere is t
. You can swim from a square to another 4-directionally adjacent square if and only if the elevation of both squares individually are at most t
You start at the top left square (0, 0)
. What is the least time until you can reach the bottom right square (N-1, N-1)
?
Example 1:
Input: [[0,2],[1,3]] Output: 3 Explanation: At time0
, you are in grid location(0, 0)
. You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0. You cannot reach point(1, 1)
until time3
. When the depth of water is3
, we can swim anywhere inside the grid.
Example 2:
Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]] Output: 16 Explanation: 0 1 2 3 4 24 23 22 21 5 12 13 14 15 16 11 17 18 19 20 10 9 8 7 6 The final route is marked in bold. We need to wait until time 16 so that (0, 0) and (4, 4) are connected.
class Solution { public int swimInWater(int[][] grid) { int N = grid.length; Set<Integer> seen = new HashSet(); PriorityQueue<Integer> pq = new PriorityQueue<Integer>((k1, k2) -> grid[k1 / N][k1 % N] - grid[k2 / N][k2 % N]); pq.offer(0); int ans = 0; int[] dr = new int[]{1, -1, 0, 0}; int[] dc = new int[]{0, 0, 1, -1}; while (!pq.isEmpty()) { int k = pq.poll(); int r = k / N, c = k % N; ans = Math.max(ans, grid[r][c]); if (r == N-1 && c == N-1) return ans; for (int i = 0; i < 4; ++i) { int cr = r + dr[i], cc = c + dc[i]; int ck = cr * N + cc; if (0 <= cr && cr < N && 0 <= cc && cc < N && !seen.contains(ck)) { pq.offer(ck); seen.add(ck); } } } throw null; } }
778. Swim in Rising Water