84. 柱状图中最大的矩形
双指针,超时,离谱子
class Solution {
public int largestRectangleArea(int[] heights) {
// 双指针
int res = 0;
for(int i = 0;i < heights.length;i++){
int cur = heights[i];
int left = i;
while(left > 0 && heights[left -1] >= cur){
left --;
}
int right = i;
while(right < heights.length - 1 && heights[right + 1] >= cur){
right ++;
}
int h = heights[i];
int w = right - left + 1;
res = Math.max(res,h * w);
}
return res;
}
}
class Solution {
public int largestRectangleArea(int[] heights) {
Deque<Integer> stack = new LinkedList<>();
int [] newHeights = new int[heights.length + 2];
newHeights[0] = 0;
newHeights[newHeights.length - 1] = 0;
for(int i = 0;i < heights.length;i++){
newHeights[i+1] = heights[i];
}
heights = newHeights;
stack.push(0);
int res = 0;
for(int i = 1;i < heights.length;i++){
if(heights[stack.peek()] <= heights[i]){
stack.push(i); //获取的是从小到大的元素
}else{
while(!stack.isEmpty() && heights[stack.peek()] > heights[i] ){
int mid = stack.peek(); //这个就是两边比他小的 首先他是单调调增,再加上当前元素是比他小的
stack.pop();
int h = heights[mid];
int w = i - stack.peek() - 1;
res = Math.max(res,h*w);
}
stack.push(i);
}
}
return res;
}
}