1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import java.util.PriorityQueue;
- class Solution {
- class Grid implements Comparable<Grid> {
- int val;
- int y;
- int x;
- Grid(int val, int y, int x) {
- this.val = val;
- this.y = y;
- this.x = x;
- }
- @Override
- public int compareTo(Grid that) {
- return this.val - that.val; // Don't forget the "public"
- }
- }
- int[] dy = new int[]{0, 1, 0, -1};
- int[] dx = new int[]{1, 0, -1, 0};
- public int trapRainWater(int[][] heightMap) {
- int m, n;
- if ((m = heightMap.length) == 0) return 0;
- if ((n = heightMap[0].length) == 0) return 0;
- PriorityQueue<Grid> pq = new PriorityQueue<>();
- boolean[][] used = new boolean[m][n];
- for (int i = 0; i < m; i++) {
- pq.offer(new Grid(heightMap[i][0], i, 0));
- pq.offer(new Grid(heightMap[i][n - 1], i, n - 1));
- used[i][0] = true;
- used[i][n - 1] = true;
- }
- for (int j = 1; j < n - 1; j++) {
- pq.offer(new Grid(heightMap[0][j], 0, j));
- pq.offer(new Grid(heightMap[m - 1][j], m - 1, j));
- used[0][j] = true;
- used[m - 1][j] = true;
- }
- int water = 0, height = 0;
- while (!pq.isEmpty()) {
- Grid curr = pq.poll();
- if (height < curr.val) height = curr.val;
- else water += height - curr.val;
- for (int i = 0; i < 4; i++) {
- int ny = curr.y + dy[i], nx = curr.x + dx[i];
- if (ny < 0 || m <= ny || nx < 0 || n <= nx || used[ny][nx]) continue;
- pq.offer(new Grid(heightMap[ny][nx], ny, nx));
- used[ny][nx] = true;
- }
- }
- return water;
- }
- }
|