IT评测·应用市场-qidao123.com技术社区

标题: Leetcode 柱状图中最大的矩形 [打印本页]

作者: 农民    时间: 2024-10-20 16:28
标题: Leetcode 柱状图中最大的矩形

h 是右边界,连续多个高度递增的柱子,如果碰到下一个 h < 栈顶元素(是最大的元素,单调递增栈),那么会不停出栈来更新计算最大面积。
并非是一次性计算出最大面积的,很紧张的一点是while (!stack.isEmpty()这一部分的判断条件,会持续多次计算并更新最大面积,
你提到的情况是非常紧张的,并且确着实某些情况下会让人觉得应该以栈底元素为高度,但现实上这必要从栈的完整处置惩罚流程来明确。我们仍然应该按照栈顶元素作为当前高度来计算矩形面积,而栈底元素终极也会被弹出并精确处置惩罚。
让我们详细分析这个详细输入 [5, 6, 7, 2] 的执行过程,看看为何终极仍会精确地处置惩罚到以栈底元素 5 为高度的矩形。
步调剖析:

初始化:


遍历开始:

弹栈计算过程:

继承遍历:

遍历竣事:

终极结果:

最大面积是 15,对应的就是以高度 5 的矩形。
总结:

java solution
  1. class Solution {
  2.     public int largestRectangleArea(int[] heights) {
  3.         int n = heights.length;
  4.         int maxArea = 0;
  5.         //栈中存放的是柱子的下标,而不是高度值
  6.         Stack<Integer> stack = new Stack<>();
  7.         for(int i = 0; i <= n; ++i) {
  8.             //h是当前柱子的高度,当i == n 时意味着到达了我们设置的最右边界
  9.             int h = (i == n) ? 0 : heights[i];
  10.             //stack中的下标对应的元素值是递增的,栈顶元素作为下标所对应的元素是之前连续递增高度的最大值,
  11.             //而h小于栈顶元素下标对应高度值,意味着碰到了右边界,需要我们持续出栈来多次更新计算最大面积值
  12.             while(!stack.isEmpty() && h < heights[stack.peek()]) {
  13.                 //确定高度和宽度
  14.                 int height = heights[stack.pop()];
  15.                 int width = (stack.isEmpty()) ? i : i - stack.peek() - 1;
  16.                 maxArea = Math.max(maxArea, height * width);
  17.             }
  18.             stack.push(i);
  19.         }
  20.         return maxArea;
  21.     }
  22. }
复制代码
关于宽度简直定

int width = stack.isEmpty() ? i : i - stack.peek() - 1;


这行代码是用于计算当前弹出的栈顶元素形成的矩形的 宽度。它看起来有点复杂,但着实逻辑很清楚:我们要确定以弹出柱子的高度为底子的矩形,它的左右边界分别是什么。
代码片段:

  1. int width = stack.isEmpty() ? i : i - stack.peek() - 1;
复制代码
这行代码的作用是计算矩形的宽度,决定矩形的左右边界。我们可以将其分为两个部分来明确。
1. 为什么必要计算宽度?

当我们从栈中弹出一个柱子时,这个柱子的高度成为当前矩形的高度,但我们还必要知道矩形的左右边界才能计算面积。

2. 代码表明

  1. int width = stack.isEmpty() ? i : i - stack.peek() - 1;
复制代码
这行代码是用来计算弹出的栈顶柱子对应的矩形宽度的,有两种情况:
情况 1:栈为空(stack.isEmpty())


情况 2:栈不为空(!stack.isEmpty())


当栈不为空时,我们的目的是计算当前弹出栈顶元素所能形成的矩形宽度,它的左右边界分别是:

因此,宽度的计算可以表示为:
  1. width = (i - 1) - (stack.peek() + 1) + 1
复制代码
简化后就是:
  1. width = i - stack.peek() - 1
复制代码
这个公式简便地表达了矩形的宽度,涵盖了从左边界(stack.peek() 后的那一个柱子)到右边界(当前柱子的前一个位置)的距离。
你已经把握了宽度计算的关键逻辑,非常棒!
3. 详细示例

我们用 [5, 6, 7, 2] 这个例子来展示如何计算宽度。

4. 总结


通过这行代码,我们可以准确地计算每个弹出栈顶柱子所能形成的最大矩形的宽度,并团结高度一起更新矩形面积。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4