单调栈理解起来很容易,但是实际运用却没那么简单。一句话解释单调栈,就是一个栈,里面的元素的大小按照他们所在栈内的位置,满足一定的单调性。
下面结合题目,在实战中学会使用单调栈解决问题。
Google面试题
(google面试)题目: 给一个数组,返回一个大小相同的数组。返回的数组的第i个位置的值应当是,对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素(如果之后没有比自己大的元素,或者已经是最后一个元素,则在返回数组的对应位置放上-1)。
简单的例子:
input: 5,3,1,2,4
return: -1 3 1 1 -1
解决方案:递减栈
implementation:
1 | vector<int> nextExceed(vector<int> &input) { |
LeetCode-42
题目: LeetCode-42. Trapping Rain Water
解决方案:递减栈
implementation:
1 | class Solution { |
LeetCode-84
题目:LeetCode-84. 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.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].
The largest rectangle is shown in the shaded area, which has area = 10 unit.
For example,
Given heights = [2,1,5,6,2,3],
return 10.
解决方案:递增栈
implementation:
1 | int largestRectangleArea(vector<int> &height) { |
LeetCode-85
题目: LeetCode-85. Maximal Rectangle
Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.
Example:
1 | Input: |
implementation:
方法一: 单调递增栈(20ms)
实质上与LeetCode-84求最大矩形面积等价,通过迭代行来更新高度数组
1 | class Solution { |
方法二:动态规划dp(16ms)
lefts[j]和rights[j]分别存储以height[j]为高度的矩阵的左边界和右边界
1 | class Solution { |
方法三:暴力枚举(60ms)
1 | class Solution { |