码上掘金-攒青豆 | 青训营笔记

56 阅读2分钟

当青训营遇上码上掘金

主题四:攒青豆

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

image.png

以下为上图例子的解析:


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

看到题目例图的第一眼想到了排序算法的柱状动图,但是如果想要满足题目条件,光对比柱子长度是不行的,需要两端全部围住才可以算作有效空间。
如果我们只靠图片,很容易判断出容器的最大容积(最短柱),但是如果靠数组或单次遍历,遇到高->低或者低->高组合的复杂情况,很容易出现判断失误,而且不能保证有未知的情况可以被判断或者规避。
为了保证鲁棒性,决定牺牲时间来换取最终稳妥的结果。

思路

  • 先定义变量记录容器边缘高度
  • 从左向右进行遍历,每遇到比前一高的就进行一次计算
  • 更高的成为新的标记位,重复该步骤直到遍历完成
  • 从右向左重复一次上述步骤
  • 每次计算是当前总面积减去柱占用面积

进行两次遍历是为了解决低高和高低,复杂度应该是O(n),对于形状规则的预设容器没有发现什么bug,但是也不排除有什么奇怪的错误。

完整代码已上传至码上掘金。