Trapping Rain Water II

127 篇文章 0 订阅

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;
       
       
       
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值