class Solution {
public int largestRectangleArea(int[] heights) {
//数组首尾增加0,确保组成有金字塔结构,满足函数运行模式。
int[] arr = new int[heights.length + 2];
arr[0] = 0;
for(int i = 1; i < heights.length + 1;i++) arr[i] = heights[i - 1];
arr[heights.length + 1] = 0;
Deque<Integer> st = new LinkedList<>();
st.addLast(0);
//只需要找到第一个小于栈顶的元素,然后栈顶的下一个元素是左边第一个小于栈顶的元素,计算w和h即可。
//为什么只需要考虑左右第一个小于这个柱子的位置,计算w*h,是因为枚举了以每个柱子高度为高度的矩形,取最大
int res = 0;
for(int i = 1; i < arr.length;i++){
while(st.size() > 0 && arr[i] < arr[st.peekLast()]){
int mid = st.pollLast();
if(st.size() > 0){
int left = st.peekLast();
int h = arr[mid];
int w = i - left - 1;
res = Math.max(res, h * w);
}
}
st.addLast(i);
}
return res;
}
}
84. 柱状图中最大的矩形
最新推荐文章于 2024-06-14 15:02:13 发布