当青训营遇上码上掘金
题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
个人解答
这道题是非常在算法中常见的接雨水问题。针对这个问题,目前也是有许多的解法:dp、单调栈等等
但是由于本人实力有限,打算用最简单的双指针的解法来解答这道题。解法相对简单易懂。
思路:
由题目分析可以看到: 咱们可以把每个每个坐标轴上的点看成是一个容器,然后看每个点上的青豆的多少,根据木桶的短板效应咱们能知道,青豆的数量是容器两边的最小的柱子所决定的。
因此我们可以使用双指针分别从两边遍历,由于能承接雨水的值是由两边中较小的数确定的,因此,那边小遍历哪边,
对于各边,在遍历过程中,更新最高的柱子高度,如果遇到比最高小的,那么代表可以承接雨水,否则更新最大高度,由于我们选择的是两边中比较小的进行遍历,那么此时另一边肯定也能承接雨水,不断循环,直到左边指针大于右边。 解法
- 先定义两个变量MAX_L和MAX_R来记录左右两端的最大值。
- 从左右两端向中间遍历。
- 如果左右指针指向的值大于对应的最大值,则更新最大值为当前值。
- 否则,计算青豆数量。
- 当左右两个指针为同一位置时,即全部遍历完成时,结束循环。