• LeetCode-Trapping Rain Water


    Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

    For example, 
    Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

    用一个栈辅助,小于等于栈顶的话压入,大于栈顶就把所有小于当前值的元素出栈,计算面积

    面积也用一个栈,每次把新的面积覆盖范围内的所有的面积出栈,剩下到最后的就是相互独立的了

    将这些面积加起来,并且减去下面的砖块就可以了

    class Solution {
    public:
        int trap(int A[], int n) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(n<=2)return 0;
            stack<pair<int,int> > s;
            stack<pair<pair<int,int>,int> > areas;
            vector<int> blockSum;
            blockSum.resize(n,0);
            s.push(pair<int,int>(A[0],0));
            blockSum[0]=A[0];
            int index=0;
            for(int i=1;i<n;i++){
                blockSum[i]=blockSum[i-1]+A[i];
                //consider left
                if(A[i]<=s.top().first){
                    s.push(pair<int,int>(A[i],i));
                }
                else{
                    pair<int,int> last=s.top();
                    //clear all small than current
                    while(last.first<A[i]){
                        s.pop();
                        if(s.size()==0)break;
                        last=s.top();
                    }
                    s.push(pair<int,int>(A[i],i));
                    int area;
                    int area_start,area_end;
                    if(last.first<A[i]){
                        area=last.first*(i-last.second-1);
                    }
                    else{
                        area=A[i]*(i-last.second-1);
                    }
                    if(area>0){
                        area_start=last.second;
                        area_end=i;
                        if(areas.size()==0){
                            areas.push(pair<pair<int,int>,int>(pair<int,int>(area_start,area_end),area));
                        }else{
                            while(areas.size()>0&&areas.top().first.first>=area_start&&areas.top().first.second<=area_end){
                                areas.pop();
                            }
                            areas.push(pair<pair<int,int>,int>(pair<int,int>(area_start,area_end),area));
                        }
                    }
                }
            }
            if(areas.size()==0)return 0;
            else{
                int sum=0;
                int bsum=0;
                while(areas.size()!=0){
                    sum+=areas.top().second;
                    bsum+=blockSum[areas.top().first.second-1]-blockSum[areas.top().first.first];
                    areas.pop();
                }
                return sum-bsum;
            }
        }
    };
    View Code

     

     

  • 相关阅读:
    SSH免密码登录
    Qt编译错误GL/gl.h: No such file or directory
    UVA 11645
    《逆袭大学》文摘——9.4 基础和应用的平衡中找到大学的节奏
    EBS採购模块中的高速接收和高速接收事务
    笔记-Android中打开各种格式的文件(apk、word、excel、ppt、pdf、音视频、图片等)
    git 冲突解决的方法
    SICP 习题 (1.43)解题总结
    Swift百万线程攻破单例(Singleton)模式
    setjmp/longjmp
  • 原文地址:https://www.cnblogs.com/superzrx/p/3337576.html
Copyright © 2020-2023  润新知