class Solution {
//找到左右两侧最近的小于当前柱子i的柱子j,
//因为即使有更远和更高的柱子也会受限制与j的高度
//利用单调栈找到最近的小于当前柱子的位置
//当遍历到height[i]时,弹出栈中比height[i]大的元素a,
//因为继续往后面遍历到j时,i会拦截,让其找不到a(因为height[i]小于a,且heght[i]更靠近j)
//left[i]表示i左侧最近的比自己小的位置,不存在则为-1
//right[i]表示i右侧最近的比自己小的位置,不存在则为n
public int largestRectangleArea(int[] heights) {
Stack<Integer> sta_left = new Stack<>();
Stack<Integer> sta_right = new Stack<>();
int n = heights.length;
int[] left = new int[n];
int[] right = new int[n];
for(int i = 0; i < n; i++){
while(!sta_left.empty() && heights[i] <= heights[sta_left.peek()]){
sta_left.pop();
}
left[i] = sta_left.empty() ? -1 : sta_left.peek();
sta_left.push(i);
}
for(int i = n - 1; i >= 0; i--){
while(!sta_right.empty() && heights[i] <= heights[sta_right.peek()]){
sta_right.pop();
}
right[i] = sta_right.empty() ? n : sta_right.peek();
sta_right.push(i);
}
int ans = 0;
for(int i = 0; i < n; i++){
ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);
}
return ans;
}
}
leetcode 84. 柱状图中最大的矩形 (单调栈)
于 2023-03-21 16:18:48 首次发布