[C++] LeetCode 407. 接雨水 II

题目

给定一个m x n的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
说明:
mn 都是小于110的整数。每一个单位的高度都大于0 且小于 20000
示例:
这里写图片描述
如上图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 的状态。
这里写图片描述
这里写图片描述
下雨后,雨水将会被存储在这些方块中。总的接雨水量是4

代码

struct Node{
    int i,j,h;
    Node(int ii,int jj,int hh):i(ii),j(jj),h(hh){}
    bool operator <(const Node &root) const{
        return h>root.h;
    }
};

class Solution {
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        if(heightMap.size()==0) return 0;
        int m=heightMap.size(),n=heightMap[0].size(),area=0,h=0;
        priority_queue<Node,vector<Node>> q;
        vector<vector<bool>> visit(m,vector<bool>(n,false));
        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(Node(i,j,heightMap[i][j]));
                    visit[i][j]=true;
                }
            }
        }
        vector<int> x={0,0,-1,1},y={-1,1,0,0};
        while(!q.empty()){
            auto f=q.top();
            if(h<f.h) h++;
            else{
                q.pop();
                for(int k=0;k<4;k++){
                    int i=f.i+x[k],j=f.j+y[k];
                    if(i>=0&&i<m&&j>=0&&j<n&&visit[i][j]==false){
                        int hh=heightMap[i][j];
                        if(hh<h) area+=h-hh;
                        q.push(Node(i,j,hh));
                        visit[i][j]=true;
                    }
                }
            }
        }
        return area;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值