当青训营遇上码上掘金
题目
主题4:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
构思
先找到最高,然后将最高和次高的中间填满,并对已经填过的地方做标记。然后再找次高和次次高,循环之前的步骤并标记。至到所有都被标记位置,代码结束。
代码实现
其中temp和temp2是用于做标记的数组,当填了之后,将temp2所处位置标记为-1。在填的时候,用if进行判断这个位置是否被标记,如果被标记就忽略不填,以此循环,至到所有位置都被标记过。
测试
以5,0,2,1,4,1,1,3,3这一组数据为例,将数据写入代码中运行
input := []int{5, 0, 2, 1, 4, 1, 1, 3, 3}
最后输出结果为: 13
如上图所示,符合题意。
总结和不足
这次的代码,写的还是过于臃肿了。就是按照过程来编程,想到哪里就写哪里,也没有考虑代码的性能问题。这个代码的时间复杂度较高,性能较低,后续可以优化代码的算法,提高程序性能。