这个主题的题目想必大家都很熟悉了,经典的接雨水。
我选择用单调栈的做法做这道题
单调栈(Monotonic Stack)是一种特殊的栈,它首先是一个栈,其次栈中的所有元素单调递增或者单调递减。 单调栈在算法中的应用在于它能够在一次扫描即O(n)的复杂度之内找到数组中每一个元素的前上界(单增栈)或者前下界(单减栈)。
那么本题使用单调栈有如下几个问题:
首先单调栈是按照行方向来计算青豆? 这点很重要
接下来考虑使用单调栈内元素的顺序那从大到小还是从小到小?
从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。
因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。
遇到相同高度的柱子怎么办? 遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。
例如 4 4 1 3 这种情况。如果添加第二个5的时候就应该将第一个4的下标弹出,把第二个4添加到栈中。
因为我们要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度。
栈里要保存什么数值? 是用单调栈,其实是通过 长 * 宽 来计算青豆面积的。
长就是通过柱子的高度来计算,宽是通过柱子之间的下标来计算,
栈里就存放int类型的元素就行了,表示下标,想要知道对应的高度,通过height[stack.top()] 就知道弹出的下标对应的高度了。
我的代码如下