407. 接雨水 II
使用优先队列
class Solution {
public:
int trapRainWater(vector<vector<int>>& heightMap) {
int water = 0;
priority_queue<vector<int>,vector<vector<int>>,greater<vector<int>>> que;
int m = heightMap.size();
int n = heightMap[0].size();
vector<vector<int>> visited(m,vector<int>(n,false));
for(int i=0;i<m;++i)
{
que.push({heightMap[i][0],i,0});
que.push({heightMap[i][n-1],i,n-1});
visited[i][0] = true;
visited[i][n-1] = true;
}
for(int j=1;j<n-1;++j)
{
que.push({heightMap[0][j],0,j});
que.push({heightMap[m-1][j],m-1,j});
visited[0][j] = true;
visited[m-1][j] = true;
}
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
while(!que.empty())
{
auto t = que.top();
que.pop();
int curH = t[0];
int x = t[1];
int y = t[2];
for(int i=0;i<4;++i)
{
int nx = dx[i] + x;
int ny = dy[i] + y;
if(nx>=0 && nx < m && ny >= 0 && ny < n && !visited[nx][ny])
{
water += max(0,curH - heightMap[nx][ny]);
visited[nx][ny] = true;
que.push({max(curH,heightMap[nx][ny]),nx,ny});
}
}
}
return water;
}
};