Leetcode 42. 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.

分析

给出N个非负整数,代表一个高度地图,计算最大的存水量,以上图为例,可以看出存水量为6。
首先从左向右依次寻找比当前高度h1更高的地方h2,如果找到,那么存水量即可按当前高度进行存水。之后以h2再向后寻找更高的地方h3,直到最后位置,发现当找到最高的h4位置后,之后就需要以更低的位置进行存水量,但是不确定啥时候,所以换个思路。
在以上面的思路从右向左计算一遍,但是要注意计算到h4位置为止,因为可能会遇到对称等情况。当时做的时候遇到好几次错误,以下给出一些易错的数据,供测试。

/*
[5,5,1,7,1,1,5,2,7,6]
[9,2,9,3,2,2,1,4,8]
[4,2,3]
[2,0,2]
[0,1,2,3,6]
[1,2,3,4,5]
[0,1,3,5,7,3,8,6,3,0,1,2]
*/
int trap(int* height, int heightSize) {
    int p=0,p1=0,ans=0;//所有存水量
    int temp=0;//一段高度值
    while(height[p]==0&&p<heightSize)
        p++;
    if(p==heightSize)
        return 0;
    p1=p;
    int h=height[p];
    //正向依次计算,直到最高点
    for(int i=p+1;i<heightSize;i++)
    {
        if(height[i]>=h)
        {
            //if(height[i]>h)flag=1;
            ans=ans+(i-p1-1)*h-temp;
            temp=0;
            h=height[i];
            p1=i;
        }
        else
        {
            temp=temp+height[i];
        }
        //printf("%d %d %d %d\n",i,h,temp,ans);
    }
    //反向依次计算,直到最高点
        temp=0;
        p=heightSize-1;
        while(p>0&&height[p]==0)
            p--;
        h=height[p];
        for(int i=p-1;i>=p1;i--)
        {
            if(height[i]>=h)
            {
                ans=ans+(p-i-1)*h-temp;
                temp=0;
                h=height[i];
                p=i;
            }
            else
                temp=temp+height[i];
            //printf("%d %d %d %d\n",i,h,temp,ans);
        }
    return ans;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Given n non-negative integers representing an elevation m...
    xxx亦凡桑阅读 261评论 0 0
  • 原题 给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水...
    Jason_Yuan阅读 2,103评论 0 2
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 两年前的一天,我正在单位上班,弟弟打来电话,说姥姥刚刚去世了。我完全失态,当着几位同事的面,嚎啕大哭。从小在姥姥家...
    3bc3eb51c115阅读 184评论 0 0