当前位置: 首页> 汽车> 时评 > 代码随想录——柱状图中最大的矩形(Leetcode 84)

代码随想录——柱状图中最大的矩形(Leetcode 84)

时间:2025/8/13 5:47:42来源:https://blog.csdn.net/qq_46574748/article/details/141922400 浏览次数: 0次

题目链接
在这里插入图片描述

我的解法(暴力)

果不其然,超时是暴力解法的宿命…
双层for循环真的很好懂,每次解题都感觉我应该是一个单细胞生物…

class Solution {public int largestRectangleArea(int[] heights) {int max = 0;for(int i = 0; i < heights.length; i++){int commonHeight = heights[i];max = Math.max(max, commonHeight);for(int j = i + 1; j < heights.length; j++){commonHeight = Math.min(commonHeight, heights[j]);max = Math.max(max, commonHeight * (j - i + 1));}}return max;}
}

优秀题解

单调栈
思路:

  1. 初始化:定义一个栈 stack 用来存储柱子的索引,一个变量 max 用来记录遍历过程中计算出的最大矩形面积。

  2. 遍历数组:通过一个 for 循环遍历每个柱子的高度 heights[i]

  3. 维护栈的单调递减:在处理每个柱子时,如果栈不为空且当前柱子的高度小于栈顶柱子的高度,这意味着我们可以计算栈顶柱子能构成的矩形面积了。因为只有更矮的柱子才能限制栈顶柱子的宽度。计算方法是:

    • 弹出栈顶柱子的索引,得到其高度 h
    • 计算宽度 w:如果栈为空,说明栈顶柱子的左边没有柱子了,宽度就是当前索引 i;否则,宽度是当前索引 i 减去栈顶索引减去 1(因为栈顶索引包含在内)。
    • 更新 max 为当前计算的矩形面积和已有最大值中的较大者。
  4. 处理当前柱子:将当前柱子的索引 i 压入栈中。

  5. 处理剩余柱子:在数组遍历完成后,栈中可能还有一些柱子没有处理。这些柱子可以看作是到达了数组的末尾,因此它们的宽度是数组的长度减去栈顶索引再减去 1

这个算法的关键在于利用栈来维护一个单调递减的序列,这样可以在遍历数组的过程中找到每个柱子的最大矩形面积。算法的时间复杂度是 O(n),其中 n 是数组 heights 的长度。

class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack = new Stack<Integer>();int max = 0;for(int i = 0; i < heights.length; i++){while(!stack.isEmpty() && heights[stack.peek()] > heights[i]){int h = heights[stack.pop()];int w = stack.isEmpty() ? i : i - stack.peek() - 1;max = Math.max(max, h * w);}stack.push(i);}while(!stack.isEmpty()){int h = heights[stack.pop()];int w = stack.isEmpty() ? heights.length : heights.length - stack.peek() - 1;max = Math.max(max, h * w);}return max;}
}
关键字:代码随想录——柱状图中最大的矩形(Leetcode 84)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: