mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
Update 0084.柱状图中最大的矩形变量名错误修复和可读性优化
This commit is contained in:
@ -515,27 +515,31 @@ func largestRectangleArea(heights []int) int {
|
|||||||
var largestRectangleArea = function(heights) {
|
var largestRectangleArea = function(heights) {
|
||||||
const len = heights.length;
|
const len = heights.length;
|
||||||
const minLeftIndex = new Array(len);
|
const minLeftIndex = new Array(len);
|
||||||
const maxRigthIndex = new Array(len);
|
const maxRightIndex = new Array(len);
|
||||||
// 记录每个柱子 左边第一个小于该柱子的下标
|
// 记录每个柱子 左边第一个小于该柱子的下标
|
||||||
minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环
|
minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环
|
||||||
for(let i = 1; i < len; i++) {
|
for(let i = 1; i < len; i++) {
|
||||||
let t = i - 1;
|
let t = i - 1;
|
||||||
// 这里不是用if,而是不断向左寻找的过程
|
// 这里不是用if,而是不断向左寻找的过程
|
||||||
while(t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
|
while (t >= 0 && heights[t] >= heights[i]) {
|
||||||
|
t = minLeftIndex[t];
|
||||||
|
}
|
||||||
minLeftIndex[i] = t;
|
minLeftIndex[i] = t;
|
||||||
}
|
}
|
||||||
// 记录每个柱子 右边第一个小于该柱子的下标
|
// 记录每个柱子 右边第一个小于该柱子的下标
|
||||||
maxRigthIndex[len - 1] = len; // 注意这里初始化,防止下面while死循环
|
maxRightIndex[len - 1] = len; // 注意这里初始化,防止下面while死循环
|
||||||
for(let i = len - 2; i >= 0; i--){
|
for(let i = len - 2; i >= 0; i--){
|
||||||
let t = i + 1;
|
let t = i + 1;
|
||||||
// 这里不是用if,而是不断向右寻找的过程
|
// 这里不是用if,而是不断向右寻找的过程
|
||||||
while(t < len && heights[t] >= heights[i]) t = maxRigthIndex[t];
|
while (t <= n && heights[t] > heights[i]) {
|
||||||
maxRigthIndex[i] = t;
|
t = maxRightIndex[t];
|
||||||
|
}
|
||||||
|
maxRightIndex[i] = t;
|
||||||
}
|
}
|
||||||
// 求和
|
// 求和
|
||||||
let maxArea = 0;
|
let maxArea = 0;
|
||||||
for(let i = 0; i < len; i++){
|
for(let i = 0; i < len; i++){
|
||||||
let sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1);
|
let sum = heights[i] * (maxRightIndex[i] - minLeftIndex[i] - 1);
|
||||||
maxArea = Math.max(maxArea , sum);
|
maxArea = Math.max(maxArea , sum);
|
||||||
}
|
}
|
||||||
return maxArea;
|
return maxArea;
|
||||||
@ -543,27 +547,37 @@ var largestRectangleArea = function(heights) {
|
|||||||
|
|
||||||
//单调栈
|
//单调栈
|
||||||
var largestRectangleArea = function(heights) {
|
var largestRectangleArea = function(heights) {
|
||||||
let maxArea = 0;
|
let maxArea = 0;
|
||||||
const stack = [];
|
const stack = [0];
|
||||||
heights = [0,...heights,0]; // 数组头部加入元素0 数组尾部加入元素0
|
heights.push(0);
|
||||||
for(let i = 0; i < heights.length; i++){
|
const n = heights.length;
|
||||||
if(heights[i] > heights[stack[stack.length-1]]){ // 情况三
|
|
||||||
stack.push(i);
|
for (let i = 1; i < n; i++) {
|
||||||
} else if(heights[i] === heights[stack[stack.length-1]]){ // 情况二
|
let top = stack.at(-1);
|
||||||
stack.pop(); // 这个可以加,可以不加,效果一样,思路不同
|
// 情况三
|
||||||
stack.push(i);
|
if (heights[top] < heights[i]) {
|
||||||
} else { // 情况一
|
stack.push(i);
|
||||||
while(heights[i] < heights[stack[stack.length-1]]){// 当前bar比栈顶bar矮
|
}
|
||||||
const stackTopIndex = stack.pop();// 栈顶元素出栈,并保存栈顶bar的索引
|
// 情况二
|
||||||
let w = i - stack[stack.length -1] - 1;
|
if (heights[top] === heights[i]) {
|
||||||
let h = heights[stackTopIndex]
|
stack.pop(); // 这个可以加,可以不加,效果一样,思路不同
|
||||||
|
stack.push(i);
|
||||||
|
}
|
||||||
|
// 情况一
|
||||||
|
if (heights[top] > heights[i]) {
|
||||||
|
while (stack.length > 0 && heights[top] > heights[i]) {
|
||||||
|
// 栈顶元素出栈,并保存栈顶bar的索引
|
||||||
|
const h = heights[stack.pop()];
|
||||||
|
const left = stack.at(-1) ?? -1;
|
||||||
|
const w = i - left - 1;
|
||||||
// 计算面积,并取最大面积
|
// 计算面积,并取最大面积
|
||||||
maxArea = Math.max(maxArea, w * h);
|
maxArea = Math.max(maxArea, w * h);
|
||||||
}
|
top = stack.at(-1);
|
||||||
stack.push(i);// 当前bar比栈顶bar高了,入栈
|
}
|
||||||
}
|
stack.push(i);
|
||||||
}
|
}
|
||||||
return maxArea;
|
}
|
||||||
|
return maxArea;
|
||||||
};
|
};
|
||||||
|
|
||||||
//单调栈 简洁
|
//单调栈 简洁
|
||||||
|
Reference in New Issue
Block a user