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

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

输入: [2,1,5,6,2,3]
输出: 10
1
2
解题思路

这个问题非常有意思。我们首先可以想到的是暴力破解,我们通过i不断遍历heights,然后在遍历的过程中通过j不断向后寻找最大矩形。

例如,我们把i从1开始遍历,j在[i,len(heights)]区间遍历。


接着我们i从2开始遍历,j在[i,len(heights)]区间遍历。

class Solution:
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        if not heights:
            return 0
        heights_len = len(heights)
        res = 0
        i, j = 0, 0
        while i < heights_len:
            min_h = heights[i]
            for j in range(i, heights_len):              
                min_h = min(min_h, heights[j])
                res = max(res, min_h*(j - i + 1))
            i += 1
                
        return res

这种解法显然很慢,我们有一种更好的思路就是通过递增栈。所谓的递增栈,就是栈中只存放递增序列。


我们首先将2加入到栈中,我们接着访问1,我们发现1比栈顶元素2小,所以我们将栈顶元素2弹出,并且记录此时的面积2。我们发现栈已经空了,所以我们要接着压栈。


接着我们通过不断遍历找到第二个递增栈。

我们接着访问2,我们发现此时2比栈顶元素6小,所以我们弹出栈顶元素6,并且记录此时的面积6*1=6。


此时栈中还有元素,我们发现此时2依旧比栈顶元素5小,所以我们需要将栈顶元素5弹出,并且我们记录此时出栈元素构成的最大面积5*2=10。

我们发现此时的2比栈顶元素大了,我们就将2压入栈中,接着将3压入栈中。此时遍历结束,我们发现栈不为空,所以我们需要进行出栈操作,出栈的同时记录出栈元素构成的最大面积即可。

class Solution:
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        stack = list()
        res, i = 0, 0
        while i < len(heights):
            if not stack or (heights[i] >= heights[stack[-1]]):
                stack.append(i)
                i += 1
            else:
                k = stack.pop()
                res = max(res, heights[k]*((i - stack[-1] - 1) if stack else i))
                    
        while stack:
            k = stack.pop()
            res = max(res, heights[k]*((i - stack[-1] - 1) if stack else i))
            
        return res
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
一个更简洁的写法。

class Solution:
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        stack = [-1]
        res = 0
        heights.append(-1)
        
        for idx, val in enumerate(heights):
            while heights[stack[-1]] > val:
                h = heights[stack.pop()]
                res = max(res, h*(idx - stack[-1] -1))

stack.append(idx)

return res
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!
————————————————
版权声明:本文为CSDN博主「coordinate_blog」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17550379/article/details/85093224

Leetcode84 柱状图中最大的矩形 详细的解法相关推荐

  1. LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)

    柱状图中最大的矩形(暴力法,单调栈) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 暴力法 3.2 单调栈 4. Java实现 1. 题目描述 难度:困难 2. 题目分析 这道题有两种解法 ...

  2. Leetcode--84. 柱状图中最大的矩形

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [ ...

  3. leetcode84. 柱状图中最大的矩形

    一:题目 二:上码 class Solution {public:/**思路:1.这里单调栈的顺序是 从栈顶到栈底 是递减的 因为我们在求出 比栈顶下标所对应的元素的小的元素时候要将栈顶元素出栈 此时 ...

  4. 柱状图中最大的矩形多种解法

    一.前言 问题来源LeetCode 84,难度:困难 问题链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 二.题 ...

  5. Leetcode 496:下一个更大元素 I(超详细的解法!!!)

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...

  6. Leetcode 739:每日温度(超详细的解法!!!)

    根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数.如果之后都不会升高,请输入 0 来代替. 例如,给定一个列表 temperatures = [73, 74 ...

  7. 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形

    84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...

  8. c语言力扣l最大矩形,leetcode 84柱状图中最大的矩形,利用单调栈求解l

    利用单调了栈求解leetcode 84柱状图中最大的矩形 image image 利用单调递增栈的方式来实现,计算发生在每次弹出栈顶的操作过程中 单调递增栈的操作步骤 1.如果栈为空或者栈顶元素比入栈 ...

  9. java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形

    84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的 ...

最新文章

  1. LeetCode 7. Reverse Integer
  2. 基于Mean-shift算法跟踪对象
  3. 浅析影响网站空间选择的三大因素
  4. YTU 2610: A改错题--体检情况分析
  5. 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37
  6. idea修改html不能立刻生效,解决idea debug模式下修改代码却不能生效
  7. 非域环境下使用证书部署数据库(SqlServer2008R2)镜像
  8. oracle主机名的脚本,一个开启Oracle服务和更改主机名的脚本-Oracle
  9. Linux基础学习导图
  10. mysql5.7空间运算,深度解析MySQL5.7之临时表空间
  11. 蓝桥杯第八届省赛JAVA真题----正则问题
  12. 学习Python,在人工智能的风口抢占未来
  13. 服务器虚拟cpu,服务器虚拟化 vcpu与内存配比
  14. git报错:remote: error: hook declined to update refs/heads/master
  15. python立体图形,python中如何画三维的图形?
  16. 用python解密百度指数数据
  17. 微博运营工具及数据分析实战全集百度云
  18. Linux下逻辑测试语句参数和流程控制语句 if语句
  19. MATLAB画四分之一球封口,在MATLAB中如何将离散点拟合成曲面图
  20. 罗默模型——对电子商务发展的理论分析

热门文章

  1. android studio 退出编译,Android studio用什么命令可以退出当前应用
  2. 大学计算机系一周上几节课,大学生晒课程表,一周45节课无双休,三个专业是满课重灾区...
  3. linux命令vgdisplay提示权限不足,linux常用命令总结
  4. 服务器被非法上传文件,DiscuzX没有合法的文件被上传的修复方法
  5. Linux内核网络数据包发送(二)——UDP协议层分析
  6. python中ret是什么意思_数据结构图在python中的应用
  7. 东华大学java_东华大学2020秋《Java程序设计》期末大作业
  8. eclipse maven打包_Maven中的几个重要概念:lifecycle, phase 和 goal
  9. 为什么 MySQL 不推荐默认值为 null ?
  10. 干掉菜鸟?微信又推出新功能:一键寄快递