1
+ // visualization of this logic: https://www.youtube.com/watch?v=cJayBq38VYw
2
+ class Solution {
3
+ public:
4
+ int trapRainWater (vector<vector<int >>& heightMap) {
5
+ int m = heightMap.size ();
6
+ if (m <= 0 ) return 0 ;
7
+ int n = heightMap[0 ].size ();
8
+ if (n <= 0 ) return 0 ;
9
+ vector<vector<bool >> visited (m, vector<bool >(n, false ));
10
+ priority_queue<pair<int , int >, vector<pair<int , int >>, greater<pair<int , int >>> minHeap;
11
+ for (int i = 0 ; i < m; i++) {
12
+ minHeap.push ({heightMap[i][0 ], i * n});
13
+ visited[i][0 ] = true ;
14
+ if (n - 1 > 0 ) {
15
+ minHeap.push ({heightMap[i][n - 1 ], i * n + n - 1 });
16
+ visited[i][n - 1 ] = true ;
17
+ }
18
+ }
19
+
20
+ for (int i = 0 ; i < n; i++) {
21
+ minHeap.push ({heightMap[0 ][i], i});
22
+ visited[0 ][i] = true ;
23
+ if (m - 1 > 0 ) {
24
+ minHeap.push ({heightMap[m - 1 ][i], (m - 1 ) * n + i});
25
+ visited[m - 1 ][i] = true ;
26
+ }
27
+ }
28
+
29
+ int totalWater = 0 ;
30
+ int maxHeight = INT_MIN;
31
+
32
+ int dx[4 ] = {-1 , 0 , 1 , 0 };
33
+ int dy[4 ] = {0 , 1 , 0 , -1 };
34
+
35
+ while (!minHeap.empty ()) {
36
+ pair<int , int > curr = minHeap.top ();
37
+ minHeap.pop ();
38
+ int currHeight = curr.first , x = curr.second / n, y = curr.second % n;
39
+ maxHeight = max (maxHeight, currHeight);
40
+ for (int i = 0 ; i < sizeof (dx) / sizeof (dx[0 ]); i++) {
41
+ int neighX = x + dx[i];
42
+ int neighY = y + dy[i];
43
+ if (neighX < 0 or neighY < 0 or neighX >= m or neighY >= n or visited[neighX][neighY]) {
44
+ continue ;
45
+ }
46
+ totalWater += max (maxHeight - heightMap[neighX][neighY], 0 );
47
+ minHeap.push ({heightMap[neighX][neighY], neighX * n + neighY});
48
+ visited[neighX][neighY] = true ;
49
+ }
50
+ }
51
+
52
+ return totalWater;
53
+ }
54
+ };
0 commit comments