您的位置:首页 > 移动开发

Trapping Rain Water II

2017-05-04 11:33 246 查看
Trapping Rain Water II

Given an 
m x n
 matrix of positive integers representing the height of each unit cell in
a 2D elevation map, compute the volume of water it is able to trap after raining.

Note:

Both m and n are less than 110. The height of each unit cell is greater than 0 and is less than 20,000.

Example:
Given the following 3x6 height map:
[
[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]
]

Return 4.




The above image represents the elevation map 
[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]
 before
the rain.



After the rain, water are trapped between the blocks. The total volume of water trapped is 4.
解析:
从四周开始从低处上升水平面

代码:

class Solution {
public:
int trapRainWater(vector<vector<int>>& heightMap) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> que;

if (heightMap.empty()) return 0;

int rows=heightMap.size();
int cols=heightMap[0].size();
int ans=0;
vector<vector<int>>vis(rows,vector<int>(cols,0));
for (int i=0; i<rows; i++)
{
for (int j=0; j<cols; j++)
{
if (i==0||i==(rows-1)||j==0||j==(cols-1))
{
int pos=i*cols+j;
que.push(make_pair(heightMap[i][j],pos));
vis[i][j]=1;
}
}
}
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
int height=INT_MIN;
while(!que.empty())
{
pair<int,int>cur=que.top();
que.pop();
int curheight=cur.first;
int currow=cur.second/cols;
int curcol=cur.second%cols;
height=max(height,curheight);
for (int i=0; i<4; i++)
{
int temprow=currow+dy[i];
int tempcol=curcol+dx[i];
if (temprow<0||temprow>=rows||tempcol<0||tempcol>=cols||vis[temprow][tempcol])
{
continue;
}

if (heightMap[temprow][tempcol]<height)
{
ans+=(height-heightMap[temprow][tempcol]);
}
vis[temprow][tempcol]=1;
que.push(make_pair(heightMap[temprow][tempcol],temprow*cols+tempcol));

}

}
return ans;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Trapping Rain Water