LeetCode 84. 柱状图中最大的矩形

这篇具有很好参考价值的文章主要介绍了LeetCode 84. 柱状图中最大的矩形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

84. 柱状图中最大的矩形

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

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

示例 1:

LeetCode 84. 柱状图中最大的矩形,LeetCode,leetcode,算法,数据结构,java

输入:heights = [2,1,5,6,2,3]

输出:10

解释:最大的矩形为图中红色区域,面积为 10

示例 2:

LeetCode 84. 柱状图中最大的矩形,LeetCode,leetcode,算法,数据结构,java

输入: heights = [2,4]

输出: 4

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4

解法思路(参考官方题解及视频讲解):

1、暴力1 O(n^3)

for i -> 0, n
    for j -> i, n
       (i, j) -> 最小高度,area
       update max-area

2、暴力2 O(n^2)

for i -> 0, n:
    找到 left bound, right bound
        area = height[i] * (right - left)
        update max-area

3、Stack

4、优化 Stack,加哨兵元素

 法一(超时):

class Solution {
    public int largestRectangleArea(int[] heights) {
        // Time: O(n^3)
        // Space: O(1)
        int maxArea = 0;
        for (int i = 0; i < heights.length; i++) {
            for (int j = i; j < heights.length; j++) {
                int minHeight = Integer.MAX_VALUE;
                for (int k = i; k <= j; k++) {
                    minHeight = Math.min(minHeight, heights[k]);
                }
                maxArea = Math.max(maxArea, minHeight * (j - i + 1));
            }
        }
        return maxArea;
    }
}

法二(超时):

class Solution {
    public int largestRectangleArea(int[] heights) {
        // Time: O(n^2)
        // Space: O(1)
        int maxArea = 0;
        for (int i = 0; i < heights.length; i++) {
            int minHeight = Integer.MAX_VALUE;
            for (int j = i; j < heights.length; j++) {
                minHeight = Math.min(minHeight, heights[j]);
                maxArea = Math.max(maxArea, minHeight * (j - i + 1));
            }
        }
        return maxArea;
    }
}

法三:

class Solution {
    public int largestRectangleArea(int[] heights) {
        // Stack 空间换时间
        // 特殊情况1:遍历完成后,栈内元素出栈时一定可以扩展到数组的末尾
        // 特殊情况2:弹出栈顶后栈为空,一定可以扩散到数组最左边
        // 特殊情况3:栈中存在高度相等的元素,出栈
        // Time: O(n)
        // Space: O(n)
        int len = heights.length;
        if (len == 0) return 0;
        if (len == 1) return heights[0];
        int maxArea = 0;
        Deque<Integer> stack = new ArrayDeque<>();
        for (int i = 0; i < len; i++) {
            // 当前元素的高度严格小于栈顶元素的高度时,出栈
            while (!stack.isEmpty() && heights[i] < heights[stack.peekLast()]) {
                int height = heights[stack.removeLast()];
                // 特殊情况3:栈中存在高度相等的元素,出栈
                while (!stack.isEmpty() && heights[stack.peekLast()] == height) {
                    stack.removeLast();
                }
                // 特殊情况2:弹出栈顶后栈为空,一定可以扩散到数组最左边
                int width = stack.isEmpty() ? i : (i - stack.peekLast() - 1);
                maxArea = Math.max(maxArea, width * height);
            }
            stack.addLast(i);
        }
        // 弹出栈中所有元素
        while (!stack.isEmpty()) {
            int height = heights[stack.removeLast()];
            while (!stack.isEmpty() && heights[stack.peekLast()] == height) {
                stack.removeLast();
            }
            // 特殊情况1:遍历完成后,栈内元素出栈时一定可以扩展到数组的末尾
            int width = stack.isEmpty() ? len : (len - stack.peekLast() - 1);
            maxArea = Math.max(maxArea, width * height);
        }
        return maxArea;
    }
}

LeetCode 84. 柱状图中最大的矩形,LeetCode,leetcode,算法,数据结构,java

优化法三:

class Solution {
    public int largestRectangleArea(int[] heights) {
        // Stack(add Sentinel)
        // Time: O(N)
        // Space: O(N)
        int len = heights.length;
        if (len == 0) return 0;
        if (len == 1) return heights[0];
        int maxArea = 0;
        int[] newHeights = new int[len + 2];
        for (int i = 0; i < len; i++) {
            newHeights[i + 1] = heights[i];
        }
        len += 2;
        heights = newHeights;
        Deque<Integer> stack = new ArrayDeque<Integer>();
        stack.addLast(0);
        for (int i = 1; i < len; i++) {
            while (heights[stack.peekLast()] > heights[i]) {
                int height = heights[stack.removeLast()];
                int width = i - stack.peekLast() - 1;
                maxArea = Math.max(maxArea, width * height);
            }
            stack.addLast(i);
        }
        return maxArea;
    }
}

LeetCode 84. 柱状图中最大的矩形,LeetCode,leetcode,算法,数据结构,java

 文章来源地址https://www.toymoban.com/news/detail-775439.html

到了这里,关于LeetCode 84. 柱状图中最大的矩形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (力扣记录)84. 柱状图中最大的矩形

    数据结构类型: 栈 时间复杂度: O(N) 空间复杂度: O(N) 代码实现:

    2024年01月20日
    浏览(23)
  • 【力扣】84. 柱状图中最大的矩形 <模拟、双指针、单调栈>

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10 示例 2: 输入: heights = [2,4] 输出: 4 提示

    2024年02月12日
    浏览(57)
  • 【算法练习Day51】柱状图中最大的矩形

    ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯 长路漫漫浩浩,万事皆有期待 力扣题目链接 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩

    2024年01月22日
    浏览(28)
  • OJ练习第101题——柱状图中最大的矩形

    力扣链接:84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 我们先嵌套一层 while 循环来向左找到第一个比柱体 i 高度小的柱体,这个过程是 O(N) 的; 单调

    2024年02月04日
    浏览(23)
  • 吃透单调栈(2)——解两道Hard题:接雨水、柱状图中最大的矩形问题

    这类题目的数据通常是一维数组,要寻找任一个元素的 右边或者左边 第一个 比自己 大 或者 小 的元素的位置(寻找 边界 ) ,此时我们就要想到可以用单调栈了。   这道题就是要求解每一个柱子左边第一个比它高的柱子,以及右边第一个比它高的柱子,然后这两个柱子间

    2024年02月10日
    浏览(26)
  • 算法leetcode|85. 最大矩形(rust重拳出击)

    给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 rows == matrix.length cols == matrix[0].length 1 = row, cols = 200 matrix[i][j] 为 ‘0’ 或 ‘1’ 面对这道算法题目,二当家的再次陷入了沉思。 要不是刚做过 84. 柱状图中最大的矩形 这

    2024年02月08日
    浏览(37)
  • 算法刷题Day 60 柱状图中的最大矩阵

    暴力解法 超时了 分别找出当前位置左边 第一个 比自己小的索引(的后一个位置)和右边 第一个 比自己小的索引(的前一个位置),这个范围之内,就是以当前位置的高度所能达到的最大宽度。 单调栈 有了接雨水那道题的经验,这一道题可以模仿着做出了

    2024年02月14日
    浏览(44)
  • 【LeetCode】85.最大矩形

    给定一个仅包含  0  和  1  、大小为  rows x cols  的二维二进制矩阵,找出只包含  1  的最大矩形,并返回其面积。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: rows == matrix.length cols == matrix[0].length 1 = row, cols = 200 matrix[i][j]  为  \\\'0\\\'  或  \\\'1\\\' 这题是建立在「84.柱形图

    2024年02月10日
    浏览(27)
  • Leetcode 85. 最大矩形

    LeetoCode地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 该题是84题的升级版。84题给出了一个一维数组,即一行数据,每个元素是高度。而该题则是给出了二维数组,只需我们将每一行的高度自行求出,即可以运用相同的算法解决。 该题目的难点在于思维模型上,如

    2024年02月20日
    浏览(26)
  • 【算法与数据结构】654、LeetCode最大二叉树

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树这两道题有些类似,相关代码可以互相参考,本题明示了要用递归来做,那么递归三要素不可缺少: 输入参数和返

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包