当青训营遇上码上掘金
23.2.15
第一次参加字节青训营,也是第一次使用稀土掘金的在线创作平台进行代码创作,感觉非常爽啊!可以在一个平台上编写多种语言,而且支持在线运行,不用在自己电脑配置复杂的工作环境,很适合刷刷算法题等一些小规模程序的编写。
我是学后端的,这次选择了攒青豆这个主题,主题内容如下:
主题 4:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)以下为上图例子的解析: 输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
我的思路其实挺简单粗暴的,既然要求能装多少青豆,那就是相当于一个求区间面积的问题。最简单的情况就是数组的第一个元素和最后一个元素是两条最高的边,整个数组只有一个区间组成。那复杂的情况该怎么划分区间呢?我的想法是双重循环。
首先从第一个柱子开始,判断柱高是否大于0,因为柱高如果为0的话是不能作为区间边界的,装不住豆子。如果柱高为0,那就跳到下一根柱子,判断下一根柱子能否作为边界啦。这时候如果柱高大于0,就可以让它作为区间起始边界,接着从它开始往后遍历找最高的柱子作为区间的结束边界。
在找结束边界的过程中也有两种情况:
- 后面的柱子都比起始柱子低,就选择最高的柱子作为区间结束边界。
- 一旦遇到比起始柱子高的柱子,立刻停止遍历,将该柱子作为区间结束边界,这样就形成了一个小区间。
找到区间结束边界之后就可以开始计算能装青豆的数量(即区间的面积),其实就是用最低的区间边界乘区间长度。在这里需要做一个判断:
- 区间是两个相邻的柱子,那肯定装不了青豆,直接将结束边界作为新的起始边界,继续往后划分新区间。
- 区间不是相邻柱子,就要计算中间总空隙的面积再减去区间内柱子的面积,得到能装的青豆数量。
最后将所有区间能装的青豆加起来就是青豆总量了。
话不多说,上代码: