当前位置: 首页 > news >正文

Largest Rectangle in Histogram题解

一. 题目简述,这是LeetCode上的一道题,是求直方图最大面积,原题题干如下:

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

 

The largest rectangle is shown in the shaded area, which has area = 10 unit.

 

For example,
Given height = [2,1,5,6,2,3],
return 10.

 

二. 解题思路

我们很容易想到的一种方法是枚举法,即列出所有的右边界和左边界,求出符合要求矩形的最大面积,这种方法的时间复杂度为O(n^2)。

另外一种方法则是助教的思路,据说是利用栈来解决这个问题,不过我却想不到QAQ...于是我上网查了下,感觉这个方法相对巧妙,查到这个方法后一开始并没有理解,在纸上画了图又操作了一遍之后终于差不多搞明白了。这个方法的巧妙之处在于首先他确保了栈中元素的高度和位置都是递增的,同时他通过出栈这个方式同时做到了求矩形面积和保留该矩形最左侧的位置高度(这个高度也是这个矩形的最低高度)信息,减少了很多运算量,把时间复杂度变成了O(n)。这个方法的具体实现步骤如下(说的比较墨迹...):

用两个栈分别储存当前矩形的高度和此时的矩形下标。从第一个位置开始遍历,若新的位置比栈顶高度高,则将新位置的高度和位置入栈;否则则一直出栈,直到遇到比新的位置高度更低的矩形为止,此时将新的位置高度入栈,再将最后一个出栈的矩形下标入栈,在这个过程中,每次有东西出栈时,就求一次矩形的面积,矩形面积的高度为即将出栈的矩形高度,宽度为当前遍历到的位置和栈顶矩形位置之间的矩形数量(包括两侧的矩形)。

遍历结束之后,栈里还有一些东西,再把栈里的东西依次出栈,每次出栈之前按上述方法求面积,在求到的一堆面积时找到最大的就是要求得面积了~

class Solution {
public:
    int largestRectangleArea(vector<int>& height) {
        if(height.size() == 0)        //对应空直方图的情况
            return 0;
        stack<int> tempheight;
        stack<int> temppos;
        tempheight.push(-1);        
        temppos.push(-1);
        int area = 0;
        int maxArea = 0;
        for(int i = 0; i < height.size(); i++)
        {
            if(height[i] >= tempheight.top())     
            {
                tempheight.push(height[i]);
                temppos.push(i);
            }
            else
            {
                int tempPos = -1;
                while(height[i] <= tempheight.top())
                {
                    tempPos = temppos.top();
                    area = tempheight.top() * ( i - temppos.top());
                    if(area > maxArea)
                        maxArea = area;
                    tempheight.pop();
                    temppos.pop();
                }
                tempheight.push(height[i]);
                temppos.push(tempPos);
            }
        }
        while(tempheight.top() != -1)
        {
            area = tempheight.top() * ( height.size() - temppos.top());
            if(area > maxArea)
                maxArea = area;
            tempheight.pop();
            temppos.pop();
        }
        return maxArea;
    }
};

 

转载于:https://www.cnblogs.com/tiezhibieek/p/4951733.html

相关文章:

  • 百度即将开源JavaScript框架Tangram
  • spring载入外部配置文件的方法
  • 各运行商通讯协议总结
  • Lua顺序 执行顺序
  • 从起步到影响世界:漫谈韩国网游发展史
  • 数据结构之停车场
  • 偏好简单可爱 社交游戏女会员达70%
  • streams 日差管理及监控
  • 暴雪:星际2仍在审批 筹划中国电竞联赛
  • awk之随机函数rand()和srand()
  • python-socket
  • 传中青宝挖角乐港热血核心团队建新公司
  • java---Unicode-字符转换器
  • 无语:SEGA开发尿尿游戏 仅供男性专用
  • 什么是元数据(Metadata)?
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Brief introduction of how to 'Call, Apply and Bind'
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java编程基础24——递归练习
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • SpiderData 2019年2月16日 DApp数据排行榜
  • WePY 在小程序性能调优上做出的探究
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始的无人驾驶 1
  • 翻译:Hystrix - How To Use
  • 小程序button引导用户授权
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • gunicorn工作原理
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #define、const、typedef的差别
  • (2)STL算法之元素计数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (floyd+补集) poj 3275
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)SpringBoot3---尚硅谷总结
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)nsfocus-绿盟科技笔试题目
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .netcore 获取appsettings
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @Resource和@Autowired的区别
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [2018-01-08] Python强化周的第一天