设为首页 加入收藏

TOP

C++ 的接雨水问题及题解分析
2018-05-21 15:48:14 】 浏览:183
Tags:雨水 问题 题解 分析

题目

给定一个m x n的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

说明:

m 和 n 都是小于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;
    }
};
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++ vector和iterator简单用法(.. 下一篇C++类模板实例说明

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目