Arithmetic problem | 海拔图最多能接住多少(面积)雨水

最近发现一道挺有趣的算法题,题目如下:

给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。


样例

如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.


解答时产生了2个思路

1:如果p点为最高点,那么p点左边与右边必会出现比p点低的海拔。(此思路错误,因为高低不平时可出现多个类似的点,从而确定不了)

2:水的确定以短板为先决条件,因此以短端向中间横切,会得到凹槽位的存水面积,由于初始化时左右两个极端的可能性已包括,因此不会对结果产生设定条件以外的影响。(此思路正确,无论地形多复杂,按照短板横切也能精准计算)


排除上述思路一后,以下为思路二的实现代码(c语言):

void part_1(int *v,int len)
{
    int im=v[0],rm=v[len-1],l=0,r=len-1,warea=0;
    while(l<r)
    {
        if(v[l]<v[r])
        {
            if(im<v[l])
                 im=v[l];
            else
                warea+=im-v[l];
            l++;
        }
        else
        {
            if(rm<v[r])
                rm=v[r];
            else
                warea+=rm-v[r];
            r--;
        }
    }
    printf("可存%d面积水",warea);
}


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值