当青训营遇上码上掘金
攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
作者:青训营官方账号
链接:juejin.cn/post/718775…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
动态规划
1.1 最优子结构
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。
1.2 重叠子问题
在用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被重复计算。 动态规划算法正是利用了这种子问题的重叠性质,对每个子问题只解一次,然后将其解保存在一个表格中,当再次需要解此问题时,只是简单地用常数时间查看一下结果。
解题思路
从左到右存储当前点左边的最大值
从右到左存储当前点右边的最大值
青豆数: Math.min(leftMax[i], rightMax[i]) - height[i]
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)