【Lintcode】364.Trapping Rain Water II
阿新 • • 發佈:2017-06-22
example rom 中心 || als ref reat map href
題目:
Given n x m non-negative integers representing an elevation map 2d where the area of each cell is 1 x 1, compute how much water it is able to trap after raining.
ExampleGiven 5*4
matrix
[12,13,0,12]
[13,4,13,12]
[13,8,10,12]
[12,13,12,12]
[13,13,13,13]
return 14
.
題解:
之前的題是Two pointer, 本質是在給定的邊界不斷向中心遍歷,這道題也是,不過邊界由兩端變成了四個邊,同樣是內縮遍歷。而且這道題還需要堆的思想來從最小端開始遍歷(防止漏水)。詳見 here。
Solution 1 () (from here 轉自Granyang)
class Solution { public: int trapRainWater(vector<vector<int> > &heightMap) { if (heightMap.empty()) { return 0; } int m = heightMap.size(), n = heightMap[0].size(); int res = 0, mx = INT_MIN; priority_queue<pair<int, int>, vector<pair<int, int>>,greater<pair<int, int>>> q; vector<vector<bool>> visited(m, vector<bool>(n, false)); vector<vector<int>> dir{{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) { if (i == 0 || i == m - 1 || j == 0 || j == n - 1) { q.push({heightMap[i][j], i * n + j}); visited[i][j] = true; } } } while (!q.empty()) { auto t = q.top(); q.pop(); int h = t.first, r = t.second / n, c = t.second % n; mx = max(mx, h); for (int i = 0; i < dir.size(); ++i) { int x = r + dir[i][0], y = c + dir[i][1]; if (x < 0 || x >= m || y < 0 || y >= n || visited[x][y] == true) continue; visited[x][y] = true; if (heightMap[x][y] < mx) res += mx - heightMap[x][y]; q.push({heightMap[x][y], x * n + y}); } } return res; } };
【Lintcode】364.Trapping Rain Water II