leetcode84.柱状图中最大的矩形
leetcode84.柱状图中最大的矩形
题目
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
用例
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
输入: heights = [2,4]
输出: 4
求解
暴力求解(超时)
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function(heights) {
let maxArea = 0;
for(let i=0;i<heights.length;i++){
let left=i;
let right=i;
while(heights[left-1]>=heights[i]&&left-1>=0){
left--
}
while(heights[right+1]>=heights[i]&&right+1<heights.length){
right++
}
let chang = right-left+1
let Area = chang*heights[i]
if(Area>maxArea){
maxArea = Area
}
}
return maxArea
};
用栈
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function(heights) {
let height_stack = []
let index_stack = []
let maxArea = 0
//哨兵
heights[heights.length]=0
height_stack.push(heights[0])
index_stack.push(0)
let final_index = 0
let flag = false
let i =1
while(i<heights.length){
//如果第i个柱子高度要严格小于栈顶元素,那么以栈顶元素为高的矩阵可以计算出其高度
if(heights[i]<height_stack[height_stack.length-1]){
flag=true
//出栈
let height = height_stack[height_stack.length-1]
height_stack.pop()
let index = index_stack[index_stack.length-1]
final_index =index
index_stack.pop()
//计算宽度
let weight = i-index
weight*height>maxArea?maxArea=weight*height:maxArea=maxArea
}else if(heights[i]==height_stack[height_stack.length-1]){
flag=false
//相等的情况直接无视
i++
}else{
//入栈
//如果是出栈以后的入栈
if(flag==true){
height_stack.push(heights[i])
index_stack.push(final_index)
flag=false
}else{
height_stack.push(heights[i])
index_stack.push(i)
}
i++
}
}
return maxArea
};

浙公网安备 33010602011771号