Skip to content

算法训练营 Day 60 | ● 84.柱状图中最大的矩形 #56

Description

@KoEkko

84.柱状图中最大的矩形

题目描述的是找能够勾勒出最大矩形的面积,我们可以找寻当前元素的左右两边第一个比他小的元素,表明以当前元素的高度,所能维持的最大长度是多少,最后直接相乘得到面积即可。

找第一个小,单调栈的顺序要求是从栈顶到栈底是递减的,所以会有以下两种特殊情况:

  • 原始数组是递增的

这个情况,我们去遍历数组加入单调栈的时候,不会走到while循环里面的逻辑

  • 第一个元素的右边就是比他小

这种情况,在计算left的时候会出现数组越界的情况,没有值。

为了避免这两种情况的发生,我们需要在数组首尾都添加0,这样子做,就能避免无法进入逻辑和第一个元素数组越界的情况。
(第二种情况也可以如果stack的长度小于0了,就取-1,因为最终我们都是取最大值的。res已经初始化为0了)

function largestRectangleArea(heights: number[]):number {
  heights.push(0); // 是防止数组是递增的,不会进入单调栈的逻辑
  const length = heights.length;
  const stack: number[] = [];
  stack.push(0);
  let res = 0;
  for(let i = 1; i < length; i ++) {
    let top = stack[stack.length - 1];
    while(stack.length && heights[i] < heights[top]) {
      const mid = stack.pop()!;
      const left = stack.length > 0 ? stack[stack.length - 1] : -1;
      const right = i;
      const w = right - left - 1;
      const h = heights[mid];
      res = Math.max(res, w * h);
      top = stack[stack.length - 1];
    }
    stack.push(i);
  }
  return res;
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions