zoukankan      html  css  js  c++  java
  • 思维+木桶理论+最小堆——leetcode407

     接雨水的二维版,先把最外层的边框围起来,然后逐步向内收缩边框,每次找边框的最低点,然后内(四个方向拓展)

    如何统计每个点的贡献?由于木桶理论,该木桶内水的高度等于木桶边框的最低点,那么拓展时如果遇到边框小于当前边框,说明这个位置可以灌水,同时这个位置的高度也可以改成当前边框的高度

    class Solution {
    public:
        
        struct Node{
            int i,j,h;
            Node(){}
            bool operator>(const Node a)const {
                return h>a.h;
            }
        };
    
        int n,m,vis[200][200];
        priority_queue<Node,vector<Node>,greater<Node> >pq;
    
        int trapRainWater(vector<vector<int>>& heightMap) {
            if(heightMap.size()==0)return 0;
            if(heightMap[0].size()==0)return 0;
            n=heightMap.size();
            m=heightMap[0].size();
            memset(vis,0,sizeof vis);
            for(int j=0;j<m;j++){
                Node t;
                t.i=0,t.j=j,t.h=heightMap[0][j];
                pq.push(t);
                t.i=n-1,t.j=j,t.h=heightMap[n-1][j];
                pq.push(t);
                vis[0][j]=vis[n-1][j]=1;
            }
            for(int i=1;i<n-1;i++){
                Node t;
                t.i=i,t.j=0,t.h=heightMap[i][0];
                pq.push(t);
                t.i=i,t.j=m-1,t.h=heightMap[i][m-1];
                pq.push(t);
                vis[i][0]=vis[i][m-1]=1;
            }
            int sum=0;
            while(pq.size()){
                Node now=pq.top();pq.pop();
                int i=now.i,j=now.j,h=now.h;
                sum+=h-heightMap[i][j];
                //cout<<i<<" "<<j<<" "<<h<<"
    ";
                if(i-1>=0 && vis[i-1][j]==0){
                    Node t;
                    t.i=i-1,t.j=j,t.h=max(h,heightMap[i-1][j]);
                    pq.push(t);
                    vis[i-1][j]=1;
                }
                if(i+1<n && vis[i+1][j]==0){
                    Node t;
                    t.i=i+1,t.j=j,t.h=max(h,heightMap[i+1][j]);
                    pq.push(t);   
                    vis[i+1][j]=1; 
                }
                if(j-1>=0 && vis[i][j-1]==0){
                    Node t;
                    t.i=i,t.j=j-1,t.h=max(h,heightMap[i][j-1]);
                    pq.push(t);
                    vis[i][j-1]=1;
                }
                if(j+1<m && vis[i][j+1]==0){
                    Node t;
                    t.i=i,t.j=j+1,t.h=max(h,heightMap[i][j+1]);
                    pq.push(t);
                    vis[i][j+1]=1;
                }
            }
            return sum;
        }
    };
  • 相关阅读:
    实验三:UML 建模工具的安装与使用
    结对编程 第二阶段
    实验二:结对编程 第一阶段
    结对编程之github使用自己的仓库
    软工 实验一 Git代码版本管理
    第七次作业
    第5次作业
    第四次作业
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12581242.html
Copyright © 2011-2022 走看看