当青训营遇上码上掘金

51 阅读3分钟

当青训营遇上码上掘金

主题:攒青豆

image.png

示例:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17 
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
简单分析,直接上手

看题,左边边界值为5,右边边界值为3,我最开始将它们从中间的4分开,分为两个杯子,然后计算出中间的青豆数量就可以了。

但是我刚写了几行代码,就想到,现在是两个杯子,但是如果数组长度发生变化,或者中间的值发生变化,杯子的数量就会变成n,中间改了很多次,始终无法实现。

直到第二天,也没有想出解题思路。

失败再来,决不放弃

我想也许是我的思路出了问题,就删掉了代码,重新回到题目认真读题和分析示例图,尝试找出规律,如图所示:

攒青豆分析图.png

因为要计算中间的青豆,肯定还是离不开将青豆放入杯子,先从左边寻找最大值,再找右边最大值, 本来我一开始的思路是想找出左右的最大值。

左边最大值数组:[5,5,5,5,5,5,5,5,5]
右边最大值数组:[5,4,4,4,4,3,3,3,3]

将输入的数组值一一对应,然后再记录下每一列能得到的青豆数量,并得到最终结果,然后我就看着这组数据,试图发现里面的规律。

最后我发现只要用右边最大值数组减去输入的数组就能得到最终结果。

但是有个问题出现了,当我输入[5,0,2,1,4,0,1,0,3]时得到17,这没问题,当时当我将第0位和最后一位数字调换一下,输入数组变成[3,0,2,1,4,0,1,0,5]后,得到了27这个结果,这很明显不正确,根据我在表格中得出的结果,绿色方块应该还是17才对。

image.png

左边最大值数组:[5,4,4,4,4,3,3,3,3]
右边最大值数组:[5,5,5,5,5,5,5,5,5]

然后我又开始找规律,发现这次要用左边最大值数组的值去减输入的数组才能得到正确的结果,到底为什么会这样?

后面我又做了几组数据进行对比,发现要用左右数组中最小的值去减输入数组中的值才行。

image.png

接下来就简单多了,加个判断,左右数组中,谁小,就用谁去减就可以了。

image.png

最终成功完成,计算出攒的青豆,几次测试均无错误:

image.png

总结: 收获非常多,尤其是当经过重重计算,解出答案来后,成就感无与伦比,瞬间有点理解那些数学狂魔,或者算法狂魔们对解题的热爱了。