import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;
//通过一个单调递增的栈找到最左和最右
//核心思想是遍历元素,栈里面保证有一个最小元素作为最低值
//用指针i遍历,不停计算i左边元素向左能延申到的最大值
class Solution {
public int largestRectangleArea(int[] heights) {
int result = 0;
//创建一个stack,里面存放下标,不能存元素,因为要通过下标计算长度
Stack<Integer> stack = new Stack<>();
//新创建一个数组,防止原数组两边过界
int[] new_heights = new int[heights.length + 2];
for (int i = 1; i < heights.length + 1; i++) new_heights[i] = heights[i - 1];
for (int i = 0; i < new_heights.length; i++) {
//当栈不为空,而且栈顶位置对应的值大于当前值时,
//只要你peek的值比我i大,栈就一直弹出元素,并且更新result
while (!stack.isEmpty() && new_heights[stack.peek()] > new_heights[i]) {
//计算i左边的result最大值
int current = stack.pop();
result = Math.max(result, (i - stack.peek() - 1) * new_heights[current]);
}
//把当前下标入栈,保证了栈有一个最低高度元素
stack.push(i);
}
return result;
}
}
leetcode84. 柱状图中最大的矩形
最新推荐文章于 2024-08-01 16:33:11 发布