柱状图中最大的矩形-hard-单调栈系列

85 阅读1分钟

柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

 

示例 1:

输入: heights = [2,1,5,6,2,3]
输出: 10
解释: 最大的矩形为图中红色区域,面积为 10

思路分析

遇到hard不要慌,一步步来

  1. 单调栈--求解一维数组下左边或右边第一个更小,或更大的元素。
  2. 面积由宽和高来决定
  3. 宽由当前基准元素的左侧第一个小的元素下标和右边第一个元素小的下标决定
  4. 为了寻找更小的,所以栈中存储单调递减的元素,这样每次弹出的永远是更小的元素。
  5. 又由于对于纯单调增或减序列,无法进入到求解需要手动补0 来强制计算。
/**
 * @param {number[]} heights
 * @return {number}
 */
var largestRectangleArea = function(heights) {
    let stack = [];
    let maxValue = 0;
    heights = [0,...heights,0]
    for(let i = 0;i<heights.length;i++){
        while(heights[i] < heights[stack[stack.length - 1]]){
            let index = stack.pop();
            let mid = heights[index];
            let left = stack[stack.length -1];
            let right  = i;
            maxValue = Math.max(maxValue,(right - left - 1)*mid)
        }
        stack.push(i)
    }
    return maxValue

};