所谓的单调栈 Monotone Stack,就是栈内元素都是单调递增或者单调递减的。单调栈的一大优势就是线性的时间复杂度,所有的元素只会进栈一次,而且一旦出栈后就不会再进来了。
google interview
给一个数组,返回一个大小相同的数组。返回的数组的第i个位置的值应当是,对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素(如果之后没有比自己大的元素,或者已经是最后一个元素,则在返回数组的对应位置放上-1) input: 5,3,1,2,4 return: -1 3 1 1 -1
- 维护一个单调递减栈
- 每个元素出栈,是说明它找到了它在原数组中的next greater element.
1 | def solution(array): |
Trapping Rain Water
Trapping Rain Water Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
1 | Input: [0,1,0,2,1,0,1,3,2,1,2,1] |
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
- 维护一个单调递减栈,每当新的高度小于等于栈顶高度,则把当前高度的坐标压入栈。
- 注意我们不直接把高度压入栈,而是把坐标压入栈,这样方便我们在后来算水平距离。
- 当我们遇到比栈顶高度大的时候,就说明有可能会有坑存在,可以装雨水。此时我们栈里至少有一个高度,如果只有一个的话,那么不能形成坑,我们直接跳过。
- 如果多余一个或多个的话,那么此时把栈顶元素取出来当作坑,记录栈顶元素的高度t。不断弹出栈顶元素直到栈顶元素不等于坑的高度。
- 此时栈顶元素是左边界,当前高度是右边界,只要取二者较小的,减去坑的高度,长度就是右边界坐标减去左边界坐标再减1,二者相乘就是盛水量。
- 注意不要弹出左边界,一下次该左边界可能成为坑的高度。
1 | class Solution: |
Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
1 | Input: [2,1,5,6,2,3] |
1 | class Solution: |