/**
* 84. Largest Rectangle in Histogram
* 1. Time:O(n) Space:O(n)
* 2. Time:O(n) Space:O(n)
*/
// 1. Time:O(n) Space:O(n)
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> s = new Stack<>();
int res = 0;
int i = 0;
while(i<=heights.length){
int val = i<heights.length?heights[i]:0;
if(s.isEmpty()||val>heights[s.peek()])
s.push(i++);
else{
int tmp = s.pop();
res = Math.max(res,heights[tmp]*(s.isEmpty()? i:i-s.peek()-1));
}
}
return res;
}
}
// 2. Time:O(n) Space:O(n);
class Solution {
public int largestRectangleArea(int[] heights) {
if(heights==null || heights.length==0) return 0;
int[] left = new int[heights.length];
int[] right = new int[heights.length];
left[0] = -1;
right[heights.length-1] = heights.length;
for(int i=1;i<heights.length;i++){
int p = i-1;
while(p>=0 && heights[p]>=heights[i])
p = left[p];
left[i] = p;
}
for(int i=heights.length-2;i>=0;i--){
int p = i+1;
while(p<heights.length && heights[p]>=heights[i])
p = right[p];
right[i] = p;
}
int maxArea = 0;
for(int i=0;i<heights.length;i++)
maxArea = Math.max(maxArea,heights[i]*(right[i]-left[i]-1));
return maxArea;
}
}