当青训营遇上码上掘金 主题4

67 阅读1分钟

当青训营遇上码上掘金

题目

主题4:攒青豆

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

image.png

构思

先找到最高,然后将最高和次高的中间填满,并对已经填过的地方做标记。然后再找次高和次次高,循环之前的步骤并标记。至到所有都被标记位置,代码结束。

代码实现

其中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

image.png 如上图所示,符合题意。

总结和不足

这次的代码,写的还是过于臃肿了。就是按照过程来编程,想到哪里就写哪里,也没有考虑代码的性能问题。这个代码的时间复杂度较高,性能较低,后续可以优化代码的算法,提高程序性能。