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号
浙公网安备 33010602011771号