class Solution {
public int largestRectangleArea(int[] heights) {
int len = heights.length;
int[] minLeftIndex = new int[len];
int[] minRightIndex = new int[len];
minLeftIndex[0] = -1;
for(int i = 1; i < len; i++){
int t = i - 1;
while(t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
minLeftIndex[i] = t;
}
minRightIndex[len-1] = len;
for(int j = len - 2; j >= 0; j--){
int t = j + 1;
while(t < len && heights[t] >= heights[j]) t = minRightIndex[t];
minRightIndex[j] = t;
}
int res = 0;
for(int i = 0; i < len; i++){
int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);
res = Math.max(res, sum);
}
return res;
}
}