leetcode 42. Trapping Rain Water

题目链接是:https://leetcode.com/problems/trapping-rain-water/description/

这个题目,我的思路是数面积,可一直error,然后就去分析大神思路了。。。

AC代码如下:

int trap(vector<int>& height) {
    int l = 0, r = height.size()-1, level = 0, water = 0;
    while (l < r) {
        int lower = height[height[l] < height[r] ? l++ : r--];
        level = max(level, lower);
        water += level - lower;
    }
    return water;
}

直接看代码来描述呢,太过抽象,我还是模拟每次的变化来说吧。

假设输入b={0,1,0,2,1,0,1,3,2,1,2,1},这是题目的例子。

1:lower=height[0]=0  level=0 water=0

2:lower=height[11]=1  level=1 water=0

3:lower=height[1]=1  level=1 water=0

4:lower=height[2]=0  level=1 water=1

5:lower=height[10]=2  level=2 water=1

6:lower=height[9]=1  level=2 water=2

7:lower=height[3]=2  level=2 water=2

8:lower=height[8]=2  level=2 water=2

9:lower=height[4]=1  level=2 water=3

10:lower=height[5]=0  level=2 water=5

11:lower=height[6]=1  level=2 water=6

从两端开始扫描,一直选取最小的墙,因为水的高只能根据最小的墙的高度来算。

level一直是扫描中,两个墙中较高的一个墙,lower是较低的一个,两者作差就是它们之间这里拦住的水的高度。为什么呢?

我们拿height[4]和height[8]来举例,height[4]=1,height[8]=2,说明先前的height[3]=2>=height[8],我们才选出了height[8],那么这时就保证了height[4]的左边height[3]和右边height[8]都是高于height[4]的。那么把他们三个抽出来,height[4]作为木桶底部,height[8]作为木桶短板,而height[3]作为木桶高板,那么height[8]-height[4]就是能装的水的高,这里统一宽度为1。

其实我也理解的有些模糊,我觉得就是这样,有更好的理解的朋友,欢迎讨论。

我就是记录一下自己做的~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值