7
const MAX = 200 * 201; // n * m + m8
const trapRainWater = (g) => {13
max = Number.MIN_SAFE_INTEGER;14
let pq = new MinPriorityQueue({ priority: (x) => x[0] * MAX + x[1] }); // first priority: x[0], smaller comes first. second priority: x[1], smaller comes first15
let visit = initialize2DArrayNew(n, m);16
for (let i = 0; i < n; i++) {17
for (let j = 0; j < m; j++) {18
if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {19
pq.enqueue([g[i][j], i * m + j]);26
let cur = pq.dequeue().element;28
r = (cur[1] / m) >> 0,29
c = cur[1] % m; // height row column30
max = Math.max(max, h);31
for (let k = 0; k < 4; k++) {32
let x = r + dir[k][0],34
if (x < 0 || x >= n || y < 0 || y >= m || visit[x][y]) continue;36
if (g[x][y] < max) res += max - g[x][y];37
pq.enqueue([g[x][y], x * m + y]);43
const initialize2DArrayNew = (n, m) => {45
for (let i = 0; i < n; i++) {46
let tmp = Array(m).fill(false);