攒青豆主题思路

60 阅读2分钟

当青训营遇上码上掘金,我选的主题是攒青豆主题,首先感觉很有意思,题中给了n个相同宽度、但是长度不同的柱子,然后均匀的从上空洒下豆子,然后计算题中所排列的柱子能接住多少青豆?题中给出了示例图中的柱子排列的解析,输入数组[5,0,2,1,4,0,1,0,3],然后得到17的结果,即题中示例的排列方式,能接住17个青豆。 第一眼看到这道题,感觉和接雨水的题型很相似,接雨水的题目大致思想是采用单调栈的方式,首先我们先回顾一下单调栈的知识。单调栈是单调递增或者递减的栈,跟单调队列差不多,但是只用到它的一端,利用单调栈可以解决一些ACM/ICPC和OI的题目,如RQNOJ的诺诺的队列等。单调递增栈,在一个队列中针对每一个元素从它右边寻找第一个比它小的元素,在一个队列中针对每一个元素从它左边寻找第一个比它小的元素。而单调递减栈是在一个队列中针对每一个元素从它右边寻找第一个比它大的元素,在一个队列中针对每一个元素从它左边寻找第一个比它大的元素。单调栈一般在为任意一个元素找左边和右边第一个比自己大/小的位置用单调栈。 然后本题中先遍历每个柱子的高度,前三个入栈,栈里面存储的是新来的元素的下标,然后栈顶元素小于新加入的元素,栈顶元素出栈。若栈里面还有元素,则需要的面积就是底乘高,其中底是当前遍历到的i-现在栈顶元素-1,高:新来的元素与当前栈的元素取最小,即得到h1,然后h1与第一步出栈的元素相减,得到H,此时面积即为底乘高。 然后所有的答案累加起来,当栈顶元素大于新来的元素时,栈里面添加元素,最后输出答案。以上就是我对主题4攒青豆的想法和解题思路。