当青训营遇上码上掘金
题目描述
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析: 输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
题目分析
为什么青豆能攒到?原因就是柱子之间形成了凹槽,青豆才能在凹槽处攒到;倘若柱子呈阶梯状,即便洒落再多,青豆也会滑落。那么接下来我们的思路就是找凹槽,然后根据凹槽计算攒青豆数。
双指针法:
左右指针指向最左边和最右边,左右指针比较,谁的高度小谁就向中间移动,在移动指针前,先判断当前高度是否是左/右指针遍历过的最高高度,拿左指针高度小于右指针高度时举例,当前左指针高度是左指针遍历过的最高左指针高度,此时左侧高度都比当前高度低,柱子呈阶梯状,攒不到青豆,但是如果当前高度不是左指针遍历过的最高高度,这就说明左侧有一根柱子比当前的柱子高,并且右侧有一根柱子比左侧最高的柱子还要高,此时就形成了凹槽,豆子就会积攒到当前左指针的柱子上,但是青豆的高度肯定不会超过左侧最高柱子的高度,不然豆子会洒出,所以左指针积攒的青豆数就是左侧最高柱子的高度减去当前柱子高度,左指针高度大于右指针高度时同理。最后当左右指针碰面时,遍历结束,返回计算好的青豆数。