当青训营遇上码上掘金
青训营掘金创作主题活动的第四题:
现有 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双指针变量进行对比计算,更容易让人理解与使用。该题目一般作为中等题出现在各种面试笔试中。是比较常见的算法题。除了接豆子以外还会以接水的形式出现。同时也可以将二维的模型变成立体的三维模型来考察算法能力。
主要思想:通过对图片的分析,不难看出其实就是求每一个柱子上面能顶着的青豆。
那么题目一下子就清晰了起来。首先用for循环遍历每一数组,在第i个数把数组切开左右两个子数组,分别找出子数组的最大值,left_max和right_max。当左边或者右边比当前的高度还小的话是接不了豆子的。所以在left_max和right_max中任意一个比height[i]小时用continue跳过这一次循环。因为接豆子的最大数量取决于短板,所以我们在left_max和right_max取两者中小的那一个与height[i]相减,得到的就是该位置能接到的豆子数num。
最后用sum+=每一个for循环算出来的num。得到的就是题目要求的能接住的最大青豆数量
具体算法代码: