当青训营遇上码上掘金
题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
分析
采用动态规划法,横向分析每根柱子上积累的青豆
即先用动态规划法做预处理,求出第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];
代码实现
总结
该解法遍历了每根柱子,时间复杂度为O(n)。dp法不难想到,思路也比较清晰,但该题还有很多种解法,是力扣上经典的接雨水问题,附上链接:leetcode.cn/problems/tr…