zoukankan      html  css  js  c++  java
  • 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

     

     

  • 相关阅读:
    android的ScaleGestureDetector缩放类详解
    ScaleGestureDetector缩放view
    setBackgroundDrawable和setBackgroundColor的用法
    Android安卓开发中图片缩放讲解
    android 比较靠谱的图片压缩
    Android ContentProvider和Uri详解 (绝对全面)
    android:intent flags
    Activity的加载模式及Intent.setFlags
    关于final中的几个忽略的点的再次阐述
    关于继承的一些问题
  • 原文地址:https://www.cnblogs.com/superzrx/p/3337576.html
Copyright © 2011-2022 走看看