主题4:攒青豆 |【青训营X码上掘金】主题创作

95 阅读1分钟
当青训营遇上码上掘金

image.png

题目

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

image.png 以下为上图例子的解析:

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

分析

采用动态规划法,横向分析每根柱子上积累的青豆

image.png 即先用动态规划法做预处理,求出第i根柱子左边的最高柱子高度left[i],和其右边的最高柱子高度right[i].递推公式如下:

初始化:left[1]=height[0];right[n-2]=right[n-1];

left[i]=max(height[i-1],left[i-1]); right[i]=max(height[i+1],left[i+1]);

然后遍历每个柱子,若左右两边最高柱子中的较小值大于当前柱子,则该柱子可以接住豆子,豆子量为min(left[i],right[i])-height[i];

代码实现

carbon (1).png

总结

该解法遍历了每根柱子,时间复杂度为O(n)。dp法不难想到,思路也比较清晰,但该题还有很多种解法,是力扣上经典的接雨水问题,附上链接:leetcode.cn/problems/tr…