难度: 困难
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function (heights) {
let maxArea = 0;
// 栈存储索引
const stack = [];
// 哨兵
heights = [0, ...heights, 0];
for (let i = 0; i < heights.length; i++) {
// 栈循环
while (stack.length && heights[stack[stack.length - 1]] > heights[i]) {
maxArea = Math.max(maxArea, heights[stack.pop()] * (i - stack[stack.length - 1] - 1));
}
stack.push(i);
}
return maxArea;
};