Trapping Rain Water[Hard] 必考题

Trapping Rain Water[Hard] 必考题_第1张图片

这道题说实话我真的一点思路都没有。。。

搬运Leetcode大神答案:


Trapping Rain Water[Hard] 必考题_第2张图片


Trapping Rain Water[Hard] 必考题_第3张图片


这道题真的是超级难。 。。水坝有两种长相,一种是完全梯度下降,一边的水坝比另一边高。【4,2,0】

一种是【4,2,3】这种, 中间比左边低,但是右边又凸起来一块。这种就不是单纯的用leftmax - middle. 而是rightmax - middle了。 这个发现是至关重要的!



[一个比较容易忘记的地方是, 当前如果比leftMax or rightMax大的话,是蓄不了水的]

Trapping Rain Water[Hard] 必考题_第4张图片

Edit on 7月28:

今天在Youtube上看了大神的思路讲解,感觉之前完全是个智障阿。。。

如果纠结于局部的水坝波峰波谷,很容易被局部迷惑。 比如你觉得隔壁的建筑比当前高一米,可以存一米的水,但是你不知道他左边还有多高的楼。左边section最高的那个波峰将会覆盖掉你旁边局部的影响。

以一种全局的角度去看,波峰是决定命运的东西。我们分两个指针,用来记录左右半边最大的波峰,然后左右往中间逼近。


Trapping Rain Water[Hard] 必考题_第5张图片

每当一个位置,马上把当前地方的储水量可以算出来。因为当前储水量depends on 左右两边矮的那一个section的最高波峰。

如下图, 一开始两个指针指向两端。 那接下来哪个指针动?答:右边。 因为右边最高波峰目前比左边小, 已经确定了 5那个位置 右边最高波峰为20,而且左边只会比20更大。 所以水位=20-15.  根据这个思路,两个指针继续移动,直到相遇。这时候把所有的储水量加起来就是总的蓄水量。

Trapping Rain Water[Hard] 必考题_第6张图片

你可能感兴趣的:(Trapping Rain Water[Hard] 必考题)