青训营主题创作——攒青豆

57 阅读2分钟

当青训营遇上码上掘金

我参加了第五届青训营主题创作中的攒青豆这个主题。接下来我将对解决攒青豆的思路进行分析。

看到攒青豆的第一反应,像极了力扣中的42题接雨水。事实上,本问题的攒青豆,本质来说就是攒雨水。而我们在解决接雨水问题时,所用到的思想是单调栈。

所谓单调栈,就是利用一个栈结构,里面的元素满足下列条件:从栈底到栈顶排列顺序是大到小或小到大。在本问题中,我使用的是从大到小的单调栈。

我们在单调栈中存放height数组的索引,且先使得单调栈中存放0。之后的具体思路如下:我们从索引1开始遍历height数组。如果该元素所对应的height数组值小于单调栈的栈顶元素所对应的height数组值,则存放入栈。如果该元素所对应的height数组值等于单调栈的栈顶元素所对应的height数组值,则将原来的元素弹出,再存放入栈。如果该元素所对应的height数组值大于单调栈的栈顶元素所对应的height数组值,则记录此时栈顶元素为mid并弹出,判断此时的栈顶元素和此时要判断的height值谁小,就能分别计算出接收青豆的高度,而宽度即height索引值-栈顶元素值-1,这样就可以计算出接收的青豆个数,重复上述过程,最终即可得到答案。

其实单调栈思想算是一个十分典型的算法,在解决特定问题的时候,他会特别有用,力扣中还有一道“柱状图中的最大矩形”,也是经典的单调栈思想。在学习算法的道路上,还是需要多多总结,这样才能做的更好。

源代码如下: