当青训营遇上码上掘金
题面
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
一些额外的假设
- 数组height的长度大于等于1(为零时没有意义)
- 可以认为青豆之间无空隙,1个青豆占据1个单位的空间
思路
初步考虑是暴力求解,遍历height,遍历时分别向左和向右寻找最大的左边界和最大的右边界,计算该height上能够承载的青豆数量。这样的算法计算复杂度是O(n^2)。
基于python的代码如下
def gather_beans(height: list) -> None:
res = 0
for i in range(len(height)):
left, right = 0, 0
j = i
while j >= 0:
left = max(left, height[j])
j -= 1
j = i
while j < len(height):
right = max(right, height[j])
j += 1
res += min(left, right) - height[i]
print("可以接住%d个单位的青豆" % res)
return res
该代码首先定义了一个res来累计每个height能够承载的青豆数量,初始值为0。之后使用for循环遍历每个height。
对于每个height,初始化最大的左边界left和最大的右边界right为0,然后从当前height开始向左寻找最大的左边界赋予left,接着向右寻找最大的右边界赋予right,则当前height能够承载的青豆数量为min(left, right) - height,用res加上这个结果。遍历完成后,打印res并返回res。
以下是我的码上掘金平台
结语
这个方法显然不是最优的,在阅读其他优秀作者写的方法之后,使用单调堆栈是一个更好的选择,后面有时间可以再研究研究,学学大佬的思路:) 另外,夸夸码上掘金平台。在上面进行简单调试代码非常方便,而且还不用考虑环境问题。在青训营上课的过程中也可以使用码上掘金的平台来巩固学到的东西,掌握更多的知识。