当青训营遇上码上掘金
主题四:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
看到题目例图的第一眼想到了排序算法的柱状动图,但是如果想要满足题目条件,光对比柱子长度是不行的,需要两端全部围住才可以算作有效空间。
如果我们只靠图片,很容易判断出容器的最大容积(最短柱),但是如果靠数组或单次遍历,遇到高->低或者低->高组合的复杂情况,很容易出现判断失误,而且不能保证有未知的情况可以被判断或者规避。
为了保证鲁棒性,决定牺牲时间来换取最终稳妥的结果。
思路
- 先定义变量记录容器边缘高度
- 从左向右进行遍历,每遇到比前一高的就进行一次计算
- 更高的成为新的标记位,重复该步骤直到遍历完成
- 从右向左重复一次上述步骤
- 每次计算是当前总面积减去柱占用面积
进行两次遍历是为了解决低高和高低,复杂度应该是O(n),对于形状规则的预设容器没有发现什么bug,但是也不排除有什么奇怪的错误。
完整代码已上传至码上掘金。