当青训营遇上码上掘金

1,259 阅读2分钟

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 个单位的青豆。

一开始是没有什么思路的,脑袋发蒙,但是画个图之后就清晰了,一个位置能接多少青豆是由左右两边最高的柱子中的最小的柱子来决定的,小的柱子高度减去当前位置的高度就是当前位置能接住的青豆数。此外,要注意一点,那就是两侧的柱子不用计算,接不住豆子,所以i是从1到height.length-2结束。

第一个方法:

这里有一个非常奇怪的地方,不知道问题出在哪里,卡了我很久,还一直在找自己的错误在哪里,逻辑梳理了好几遍,发现没有问题,最后觉得肯定是语法错误,对比了其他的解法,我把自己的let left和right移到了循环内,结果就从20变到了正确答案17,实在是离谱。给我整破防了!

希望有知道的同学可以留言区评论一下,感谢!

第二个方法:双指针法

这个时候才发现原来这个题目是leetcode接雨水问题的改编407. 接雨水 II - 力扣(LeetCode)

该函数使用双指针法来解决这个问题。我们从最左和最右两个指针开始,如果左指针指向的柱子高度小于右指针指向的柱子高度,我们将左指针右移,反之我们将右指针左移。我们维护两个变量 leftMax 和 rightMax 来记录每个指针左边最大的柱子高度。如果当前柱子高度小于它左边最大的柱子高度,我们累加 trappedWater 变量。