攒青豆啊~

76 阅读2分钟

当青训营遇上码上掘金!!!(应该是这样吧呜呜~🥹)

弱弱来参与「青训营 X 码上掘金」主题创作活动啦。因为我选择的是青训营后端进阶班,所以理所应当我选择的活动主题是后端的三&&四,于是毫不犹豫的选择的四:“攒豆子”。正如我的心一般,迫切需要豆子来填补我的空虚。

第四个主题是“攒豆子”,实际上就是一个算法题目,题目大意如下:

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

创作灵感:

当我拿到这个题目的时候,我以为需要后端逻辑实现,类似于一个完全的项目,但是读完题目之后了解到,其实就是一个小算法题(芜湖~),这个题目还有一个名字“接雨水”。所以我瞬间能想到思路。

思路一:

我们知道图像两边并没有墙壁,并且总的接豆豆的高度不会超过max(所有的挡板)。于是我们找到其中最大的挡板,分别向两边找到次大的挡板,其中的所有位置都会被这两个挡板“保护着”,所以我们可以通过单调栈来实现。两个方向两个单调性不一样的单调栈。这个写法仅需单调栈这个算法,这里不展示了,大家可以学习一下单调栈(推荐oi-wiki)。

思路二:

变更一个思路,我们以其中一个挡板为参考对象,他所能够接到的豆子数量,取决于两边能帮他卡住多少,所以我们只需要知道每一个位置左右两边的最高的挡板是多高(大于等于自己)。所以我们可以正反维护一个前缀最大数组。然后两边卡就知道当前位置能够接住多高的豆子。取两边的min即可。 参考代码: 码上掘金