题目地址: 链接
根据题目易知,想要形成矩形,至少有一个值是完全使用的,所以可以利用单调栈记录每个值的可扩善(左右任意一侧)的最远距离。
最终,根据每个值最远可扩善距离 * height[i],循环比较完毕后即可获取最大矩形面积
TS
function largestRectangleArea(heights: number[]): number {
const n = heights.length;
const dpLeft = new Array(n).fill(0);
const dpRight= new Array(n).fill(0);
const stk = [];
for(let i = 0; i < n; i ++) {
let [num, idx] = [0, -1];
while(stk.length && stk[stk.length - 1][0] >= heights[i]) {
[num, idx] = stk.pop();
}
if(stk.length === 0) dpLeft[i] = i;
else dpLeft[i] = i - stk[stk.length - 1][1] - 1;
stk.push([heights[i], i]);
}
let ans = 0;
stk.length = 0;
for(let i = n - 1; i >= 0; i --) {
let [num, idx] = [0, n];
while(stk.length && stk[stk.length - 1][0] >= heights[i]) {
[num, idx] = stk.pop();
}
if(stk.length === 0) dpRight[i] = n - i - 1;
else dpRight[i] = stk[stk.length - 1][1] - i - 1;
stk.push([heights[i], i]);
ans = Math.max((dpLeft[i] + dpRight[i] + 1) * heights[i], ans);
}
return ans;
};