柱状图中最大的矩形
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 122 ms, 内存: 26.3 MB
/*
* 思路:Java Stream 不太适合处理需要状态维护的单调栈问题。
* 但是我们可以利用数组索引流和叠加来进行模拟。
*/
import java.util.Stack;
import java.util.stream.IntStream;
public class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
final int[] maxArea = {0};
IntStream.rangeClosed(0, heights.length).forEach(i -> {
int h = (i == heights.length ? 0 : heights[i]);
while (!stack.isEmpty() && h < heights[stack.peek()]) {
int height = heights[stack.pop()];
int width = stack.isEmpty() ? i : i - 1 - stack.peek();
maxArea[0] = Math.max(maxArea[0], height * width);
}
stack.push(i);
});
return maxArea[0];
}
}
解释
方法:
本题解采用单调栈的方法来解决问题。首先,在数组的开始和结束位置分别添加一个高度为0的柱子,以便处理边界条件。维护一个单调递增的栈,栈中存储的是柱子的索引。遍历输入数组中的每个柱子,当当前柱子的高度大于栈顶元素对应的柱子高度时,直接将当前索引入栈。如果相等,替换栈顶元素。如果当前柱子的高度小于栈顶元素对应的柱子的高度,则持续将栈顶元素弹出,并计算以该栈顶元素为高度的矩形面积,直到栈顶元素的高度小于或等于当前柱子的高度。计算矩形的宽度为当前索引与新的栈顶元素的索引之间的差减一。每次计算完面积后,更新最大面积。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在解题思路中需要在数组的开始和结束位置分别添加一个高度为0的柱子?这样做有什么特殊的作用?
▷🦆
单调栈中为什么选择维护一个单调递增的栈而不是单调递减的栈?这样的选择对算法的效果有何影响?
▷🦆
在遍历过程中,如果当前柱子高度等于栈顶柱子高度时,为什么要替换栈顶元素而不是保留原栈顶元素?
▷