「青训营 X 码上掘金」| 攒青豆 题解

55 阅读1分钟

题面

  • 攒青豆

    现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

攒青豆.png

以下为上图例子的解析:

输入:height = [5,0,2,1,4,0,1,0,3]  
输出:17  
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

作者:青训营官方账号
链接:juejin.cn/post/718775…


这道题看起来很熟悉,仔细一想,这不就是“接雨水”问题嘛 这里放一下原题链接 leetcode.cn/problems/tr…

image.png


关于这道题,可以使用单调栈的思路

使用单调栈找x位置左边第一个比它大的位置

我们再重新看一下题面,思考几种情况

image.png

对于一直单调下降的情况,可以容纳的数量为总和去掉最大值

image.png 对于一直单调上升的情况,可以容纳的数量为总和去掉最大值

image.png 对于出现单调性转变的情况,可以容纳的数量为 左侧符合单调性的容纳的 + 每一层累加的

针对这三种情况,我们结合“单调栈”这个工具,可以把思路整理出来。

  • 维护一个单调减小的栈,若当前柱子高于栈顶的柱子,退栈直到符合单调性;否则加入栈顶。
  • 每次退栈时,累加豆子的体积(每次算一层)。
  • 最后栈是一个单调栈,结束程序即可