主题 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 个单位的青豆。
分析
此题为leetcode算法42接雨水-力扣(LeetCode)的接雨水问题的变种,因本人算法基础较浅,所以只给出一种解法。本题采用的是动态规划方法来解。
解题思路:
把黑色看成一个柱子,绿色是豆子,宽度一样,给定一个数组,每个数代表从左到右柱子的高度,求能装多少单位的豆子。也就是上图中绿色凹形的个数。
即我们只需找到周围两边最高的柱子,去比较两个柱子之间的最低高度,用最低高度的柱子减去所求列的柱子高度,则可得积攒的青豆数。
代码如下:
总结: 简单来讲,该代码的逻辑大致是:遍历整个数组,通过动态规划,先定义青豆数和柱子高度;再定义左边和右边柱子的最高高度;接着为每一列柱子计算其左边和右边最高的柱子大小,并计算此两者之间最低的那个柱子,然后用最低的那个柱子的大小减去该列柱子的大小即可得知该列柱子最大可积攒的青豆数,最后定义统计攒青豆数就可以了。