「青训营 X 码上掘金」主题 4——攒青豆

68 阅读2分钟

当青训营遇上码上掘金

主题题目

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

image.png

以下为上图例子的解析:

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

题目分析

题目的目的是要计算每一列柱子能够接住的青豆数。可以使用双指针法解决这个问题。

为了解决这个问题,我们可以采用双指针的方法。我们从两端开始搜索,如果左边的柱子比右边的柱子短,那么我们就向右移动左指针,直到我们找到一个比左边柱子高的柱子。当我们找到一个比左边柱子高的柱子时,我们可以计算出两个柱子之间的容量。同理,如果右边的柱子比左边的柱子短,我们就向左移动右指针,直到找到一个比右边柱子高的柱子。

具体步骤如下:

首先,从左边第一个柱子开始遍历数组,同时使用两个指针 left 和 right。初始状态下,left 指向当前柱子,right 指向与当前柱子高度相同或高于当前柱子的最靠右的柱子。

接着,如果 right 比当前柱子高度低,那么当前柱子高度与 right 之间的所有位置都可以接住青豆,因此令 right 向左移动,并累加所有可以接住青豆的位置的数量。

最后,如果 right 指向了第一个柱子,那么从当前柱子到 right 指向的柱子所有位置都可以接住青豆,因此将当前柱子向后移动,并重复以上操作。

双指针法的时间复杂度是 O(n),因此程序可以快速地计算所有柱子可以接住的青豆数。

代码

测试用例

输入:height = [5,0,2,1,4,0,1,0,3]
输出:17

ZB70A8F(PBMWBC~}HQ8%KGI.png

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6

D8P_16S5Q@UZ95{HD0$$AZV.png