题目描述
问题描述 给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)
数据范围:1≤n≤1000000,数组中每个值满足 >=0
示例
输入:[3,1,2,5,2,4]返回值:5
说明:数组 [3,1,2,5,2,4] 表示柱子高度,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水
分析
定性分析
正如一个巴掌拍不响,一根、两根柱子存不住水,想要存住水,至少需要三根柱子,且形状要满足“凹”型,意味着某个柱子想要存水,它的左边和右边均必须至少要有一根高于自身高度的柱子
具体到每根柱子,分析如下:
- 0号柱子,因为它左边没有比它高的柱子,所以它不能存水
- 1号柱子,它左边的柱子只有一根,是0号,比它高,它的右边有四根柱子均比他高,所以它能存水
- 2号柱子,它左边有两根柱子,但只有0号柱子比它高,右边有三根柱子,其中有两个比它高,满足两边均至少有一根高于自身这个条件,所以它也能存水
- 3号柱子,一柱擎天,左右两边都没有比它高的柱子,所以它不能存水
- 以此类推,4号柱子,左右各有一根柱子比它高,能存水
- 5号柱子,满足左边有1根柱子比它高,但它的右边是空的,不满足两边均至少有一根高于自身这个条件,所以它不能存水
定量分析
上面定性的分析了能不能存水的条件,接下来定量的分析一下能存多少水的问题
能不能存水取决于能否构成“凹”型,能存多少水取决于“凹”型两边的高度,且根据木桶效应:一个木桶能装多少水,取决于最短的那块板。“凹”型能存多少水,也取决于两边最低的那根柱子。
- 0号柱

本文详细解析LeetCode 42题——接雨水问题,通过定性与定量分析,探讨如何计算数组表示的柱子高度图中能接收到的雨水量。文章提供了Java代码实现,并进行了优化,解释了如何判断并计算柱子间的雨水存储。
最低0.47元/天 解锁文章
100

被折叠的 条评论
为什么被折叠?



