当青训营遇上码上掘金-攒青豆

163 阅读2分钟

当青训营遇上码上掘金

题目

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

image.png

分析

本题是力扣接雨水的变形题,只是换了个壳,把雨水换成青豆,把力扣的核心代码模式换成码上掘金的ACM模式而已,区别就是自己定义个Main函数进行测试。

力扣题目链接:leetcode.cn/problems/tr…

攒青豆(或者说接雨水)作为面试高频题,考察选手对场景的理解,是否能想到抽象成数据结构问题,场景的执行逻辑是什么?这是一定一定要想清楚的。

思路

首先,我们要分析出来的是,场景是如何发生的?对应攒青豆这道题,就是青豆是如何攒起来的。不难分析出,可以横向攒,也可以纵向攒,这里我采用纵向攒来解题。我们解题也应该统一一下方式,不能一会横向攒,一会纵向攒,很容易把自己绕晕。

然后,我们由题意知,给出的是n个柱子的高度,最后返回的要是青豆的数量。那么青豆的数量和什么有关,当然是和柱子的高度有关了。可以自己举个例子,一个单独的攒青豆的空间,左边柱子高度为1,右边柱子高度为2,那么最后攒的青豆的高度为多少,当然是1!所以我们只需要求出左右两边最低的柱子的高度,并且遍历所有柱子(就是遍历传入的数组),求总和即为接住青豆的数目。

写到这里,应该能猜到要用的数据结构或者算法,既然要统计两边的高度,就先一个for循环遍历传入的数组,然后里面两个for循环分别遍历左右两边柱子,求最小值并且减去当前柱子的高度,统计在一个结果集里,最后返回结果集即可。就是双指针的思想。

代码