leetCode_Trapping Rain Water

来源:互联网 发布:阿里云可以干嘛 编辑:程序博客网 时间:2024/05/22 01:38

题意:给定n个非负数代表每个柱子的高度,宽度均为1。问能在空间里放多少水。

解法:设定previous与next,然后移动next,找到第一个比prevoius高的或者比prevoius低的柱子当中最高的。然后两者较低的乘以宽度-所有柱子的高度之和即为prevoius,next之间的蓄水量。然后让prevoius=next,依次循环。挺虐的,做了小半天才AC。

代码:

int trap(vector<int>& height){    int i=0,j,ans=0,size=height.size(),has=0,tsum=0,r=0,ti,pre,next,tmax;    if(height.size()==0) return 0;    while(height[i]==0) i++;    pre=i;    next=i+1;    while(pre<size-1)    {        tsum=height[pre];        tmax=-1;        while(height[next-1]>height[next]&&next<size)        {            tsum=tsum+height[next];            next++;        }        if(next>=size) break;        while(next<size)        {            tsum=tsum+height[next];            if(height[next]>=height[pre])            {                tmax=height[next];                ti=next;                break;            }            else            {                if(tmax<height[next])                {                    tmax=height[next];                    ti=next;                }            }            next++;        }        if(height[ti]>=height[pre])ans=ans+min(height[pre],height[ti])*(ti-pre+1)-tsum+abs(height[pre]-height[ti]);        else for(i=pre;i<=ti;i++) if(height[i]<height[ti]) ans+=height[ti]-height[i];        pre=ti;        next=ti+1;    }    return ans;}


0 0
原创粉丝点击