当青训营遇上码上掘金 | 攒青豆

64 阅读2分钟

当青训营遇上码上掘金

题面

  • 主题 4:攒青豆

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

攒青豆.png

输入

height = [5,0,2,1,4,0,1,0,3]

输出

17

hint

上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

题解

暴力算法

首先我们用最暴力的方法思考这道题,对于每一个柱子来说,他能攒下的青豆为他min(前面柱子最高高度,后面柱子最高高度)-当前柱子的高度,我们只需要对每个柱子遍历前面最高柱子与后面最高柱子然后取最小的减去他当前的高度即可,对所有的柱子重复以上的操作之后即可得到答案。但是这个算法时间复杂度显然是O(n2n^2)的于是我们考虑优化

dp动态规划

考虑到当前柱子算完之后的下一个柱子,他前面最高的那个柱子要么是之前那根柱子,要么是之前那根柱子所对应的前面最高的柱子,他后面最高的那个柱子要么是后面那根柱子,要么是后面那根柱子所对应的后面最高柱子,这个问题存在最优子结构,可以通过dp(动态规划)来优化,用两个数组,一个记录当前柱子往前最高的柱子,一个记录后面柱子往后最高的柱子,这两步算法明显是可以并行的,最后我们再将每个柱子用之前暴力的算法来加和得到答案,时间复杂度为O(nn)的。

代码如下(动态规划版本)