码上掘金主题4:攒青豆

54 阅读1分钟

当青训营遇上码上掘金

问题:攒青豆

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

a.png

以下为上图例子的解析:

输入:n = 9,height = [5,0,2,1,4,0,1,0,3]

输出:17

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

分析

本题实际上与接雨水类似,在不超出“容量”的情况下能接到青豆数的最大数量。这里的“容量”指的是对于每个槽能存储的最大青豆数量,所有的槽能存储青豆的最大值,相加即为答案。

解决思路

开三个vector数组h、left rightleft[i]表示 h[i] 左边比它最高的柱子的高度,right[i] 表示 h[i] 右边比它最高的柱子的高度,h[i]表示第i个柱子的高度。首先预处理出left和right数组: left[i] = max(left[i - 1], h[i]), i从前往后枚举; right[i] = max(right[i + 1], h[i]),i从后往前枚举。对于每个柱子h[i],其能容纳的青豆数量的最大值为 min(left[i], right[i]) - h[i],最后定义一个int型变量res,初值为0,将每个柱子所能容纳的最大容量相加即为答案: res += min(left[i], right[i]) - h[i]

运行结果

b.png

源码链接

[](青训营—— theme4 - 码上掘金 (juejin.cn))