当青训营遇上码上掘金
攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
攒青豆这道题与42. 接雨水 - 力扣(LeetCode) 一模一样,只不过接的载体从青豆变成了雨水😒
不得不认同评论区的高赞回答
攒青豆是哪个大聪明运营想出来的主意
思路
第一反应先找到最大的那个柱子,然后在它的左边找到第二大的柱子,就可以计算这两个柱子之间可以攒的青豆数了(接的雨水的量)。右边也同理。大概是采用了分而治之+动态规划的思想
但是虽然最后代码确实跑通了,再让我写一遍我应该是写不出来了🤣 会被一些奇奇怪怪的条件绕进去
因此这里参考Leetcode题解中的双指针思路进行求解
解法
维护两个指针left和right,分别从输入数组的左右两端往中间靠拢。同时维护一个leftMax和rightMax值,代表着left以左、right以右经历过的数组中的最大值。假设输入的数组为height
对于每个height[left], 这一列所能装的青豆数就是min(leftMax,rightMax) - height[left],维护一个ans变量每次加上这一列计算出的数值即可
代码
Java版本