-
主题 4:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
里面的第一个for循环,我先去找arr[i]之前离他最近的比他大的数。找到了,记住下标。没找到就是自身。
h目的是计算(k,i)开区间内最多能装多少个。
如上图,就是2。计算如下:
h=min(5,2)*(2-0-1)=2
第二个for循环就是计算(k,i)开区间实际能装多少,由于下标1的地方没有高度,那么可以装2个。
接着就是将下标为1的地方填上,具体的高度就是下标为i时的高度。如下图所示。
结束时大于0时将暂时的结果存起来(res就等于2了)。以此类推。
继续
当i=4时,从前找,找到离i最近且比arr[i]大的下标,那么k就等于5。
那么我的初始h值为:
h=min(5,4)*(4-0-1)=12
接下来在(0,4)开区间内(下标为1,2,3),h的值减去已有的柱子(2,2,1) 那么h就只剩下7可以填了,并把柱子填上。
h的结果保存下来,那么目前res就是9(之前为2)。
循环下去,就能求出能接住多少青豆。
非常简易的做法,没做任何优化。不保证AC。但是这是一种思路。🤞