青训营 X 码上掘金 | 攒青豆(主题四)

60 阅读2分钟

当青训营遇上码上掘金。

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

image.png

解题思路

本题我使用的是双指针解法。首先来看下思路:

首先我们来看下木桶效应:一只木桶能盛多少水,并不取决于最长的那块木板,而是取决于最短的那块木板。

再回到本题,对题目进行分析,我们可以知道,每一列能够装的青豆数,取决于该列左侧最高的柱子高度,和右侧最高的柱子高度中较矮的那个。

具体来说就是取左右两侧最高的柱子高度中较矮那个,然后减去当前列的高度,得到的就是该列能攒的豆子数。

符号描述

用符号描述就是:

假设col代表当前列的高度,max_left代表当前列左侧最高的柱子高度,max_right代表当前列右侧最高的柱子高度。则当前列能够装的豆子数可以由该表达式计算:min(max_left,max_right)-col

举个例子,我们看上图的第2列(序号为1)高度为0,它左侧最高的柱子高度为5,右侧最高的柱子高度是4,所以它能够装的豆子数=4-0=4

同理,第3列(序号为2)高度为2,它左侧最高的柱子高度为5,右侧最高的柱子高度是4,所以它能够装的豆子数=4-2=2

只要遍历一遍所有的列,然后求出每一列能够装的豆子数,相加之后就是总的豆子数了。在编写代码中,我们需要用到两个指针指向当前列左右两侧最高的柱子,所以该解法也叫做双指针解法。

代码

代码如下: