青训营 X 码上掘金主题创作活动 入营版 主题 4:攒青豆题解

204 阅读3分钟

当青训营遇上码上掘金,我在这次青训营 X 码上掘金主题创作活动中,选择了做主题4。

审题

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

解题思路

我们可以把整体拆分成列,然后按列求,求每一列的青豆,只需要关注当前列、左边和右边最高的柱子就够了。而装青豆的多少,也就只需要看左边最高的柱子和右边最高的柱子中较低的一个就够了。所以,这里我们根据较低的那个柱子和当前列的柱子的高度可以分为三种情况(这里把红色方块看作柱子,绿色方块看作一个单位的青豆,求排列的柱子能接住多少青豆就是求绿色方块的数量):

一:较低的柱子的高度大于当前列的柱子的高度 3.jpg 如图,把正在求的列左边最高的柱子和右边最高的柱子确定后,现在想象一下,往两边最高的柱子之间撒青豆。正在求的列会有多少多少青豆?很明显,较低的一边,也就是左边的柱子的高度,减去当前列的高度就可以了,也就是 2 - 1 = 1,可以存一个单位的青豆。

二:较低的柱子的高度小于当前列的柱子的高度 4.jpg 想象下,往两边最高的柱子之间撒青豆。正在求的列会有多少青豆?正在求的列不会有青豆,因为它大于了两边较低的柱子。

三:较矮的柱子的高度等于当前列的柱子的高度 5.jpg

此时和第二种情况一样,正在求的列不会有青豆。

基于这三种情况,就很好写了,只需要遍历每一列,然后分别求出这一列两边最高的柱子。找出较低的一端,和当前列的高度比较,结果就是上边的三种情况。我们实际在解的时候考虑边界条件,最两端的列就不用考虑了,因为一定不会有青豆,所以实际计算数组下标是从1到length-2,大思路就是先找出左边最高,再找出右边最高,然后比较出两边较小的,同时要明确只有较小的一段大于当前列的高度才会有青豆,其他情况都不会有青豆

代码

小结

就是大力出奇迹,暴力解法适合我

时间复杂度:O(n²),因为遍历每一列需要O(n),找出左边最高和右边最高的墙加起来刚好又是一个O(n),因此应该还有更优解

空间复杂度:O(1)