【栈】Leetcode 84. 柱状图中最大的矩形【困难】

柱状图中最大的矩形

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

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

示例 1:


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

解题思路

  • 1、使用单调栈解决问题。
  • 2、遍历柱状图的高度数组,对于每个柱子的高度:
复制代码
   如果栈为空或者当前柱子的高度大于等于栈顶柱子的高度,则将当前柱子的索引入栈;
复制代码
   否则,不断弹出栈顶元素,并计算以弹出元素为高度的矩形的面积,更新最大面积值。
  • 3、在遍历完成后,如果栈中仍有柱子,则按照右边界为数组长度计算矩形面积。

关键是理解思路,为什么需要这么做,参考下面图解理解
查看leetcode图解方法二:以空间换时间,可以使用的数据结构是栈

Java实现

java 复制代码
public class LargestRectangleInHistogram {

    public int largestRectangleArea(int[] heights) {
        int n = heights.length;
        Stack<Integer> stack = new Stack<>();
        int maxArea = 0;

        for (int i = 0; i <= n; i++) {
            //如果当前柱子的高度小于栈顶柱子的高度,说明找到了一个可能构成矩形的位置
            //stack不为空且i == n,证明剩下的栈里面都是递增的数据
            while (!stack.isEmpty() && (i == n || heights[i] < heights[stack.peek()])) {
                //前一个柱子高度
                int height = heights[stack.pop()];
                //栈为空就是没有数据高度比当前数据低,宽度就是数组坐标
                int width = stack.isEmpty() ? i : i - stack.peek() - 1;
                maxArea = Math.max(maxArea, height * width);
            }
            stack.push(i);
        }

        return maxArea;
    }

    public static void main(String[] args) {
        LargestRectangleInHistogram solution = new LargestRectangleInHistogram();
        int[] heights = {2, 1, 5, 6, 2, 3};
        int maxArea = solution.largestRectangleArea(heights);
        System.out.println("Max area: " + maxArea);  // Output: 10
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中n为柱状图的高度数组heights的长度。因为需要遍历柱状图的高度数组一次。

  • 空间复杂度:O(n),使用了一个额外的栈来存储柱子的索引。

相关推荐
夜思红尘2 小时前
算法--双指针
python·算法·剪枝
散峰而望3 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo3 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……3 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L3 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
在风中的意志3 小时前
[数据库SQL] [leetcode] 2388. 将表中的空值更改为前一个值
数据库·sql·leetcode
智者知已应修善业4 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
还不秃顶的计科生4 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
LYFlied4 小时前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0115 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表