当青训营遇上码上掘金
主题题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入: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
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6