这是属于单调栈经典的题目,
这一类题目属于单调栈求下一个更大问题,我们需要关注,什么时候进栈,何种情况下出栈。
题目分析: 为了能够接到雨水,柱子的高度先递减后增加,如果某个高度的柱子要能够接雨水,则必须找到下一个更大的柱子,才能接雨水。 考虑最左侧的高度为0,因此若一直升序则无法积攒雨水,积攒雨水的情况只可能发生在降序出现时。枚举当前柱子高度,若小于栈顶则入栈,高于栈顶,则发生了积攒雨水的情况。计算这一局部雨水量,并弹出栈顶,继续比较当前柱子和栈顶柱子。 具体计算局部雨水量的方法:从栈顶向左看一下(次栈顶),向右看一下(当前柱子),取两者的水平距离为矩形底,取两者中较低者(高于较小的部分会溢出)与栈顶高度做差,为矩形高。底乘高计算局部雨水面积。
代码编写思路
首先建立一个栈,然后遍历数组,栈不为空并且大于栈顶的时候开始出栈,出栈过程中记录好低的那个水平线,并且出栈的过程中当栈不为空的时候,最终结果加上高水平先减去低水平先乘上距离。
边界处理 当我们出栈的时候,栈为空了,无法向左看,这个时候是接不了雨水的。这时栈顶与当前柱子间的雨水都计算完毕,可以出栈。让当前柱子进栈。
时间空间复杂度分析
存在极端情况,最左边的棒子的高度是最高的,此时需要反过来再遍历一次所有元素,也就是2n,所以时间复杂度是O(n), 在极端情况下,最左边的棒子的高度是最高的,此时需要反过来再遍历一次所有元素,需要创建一个新数组,所以空间复杂度也是2n,是O(n),
同类型题目分析
同类型题目有矩形最大问题,与矩形最大问题相反,矩形是要得到当前高度上一个和下一个更小元素的柱子。因此是求上一个和下一个更小