博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode Largest Rectangle in Histogram 单调栈
阅读量:6956 次
发布时间:2019-06-27

本文共 1464 字,大约阅读时间需要 4 分钟。

作者:jostree  

题目链接  

对于每一个长条都向前找包含这个长条的最大面积使可行的,但是时间复杂度是O(n^2)大数据会超时。经过观察发现并不需要对每一个长条都向前查找,对于height[i],如果height[i+1]>height[i],那么就没有必要向前查找,原因是可以从height[i]查找到的最大面积向后延伸一格,那么一定大于当前所查找到的面积。因此我们维护一个单调递增栈(严格来说是单调非减),当发现当前的高度小于栈顶元素时,弹栈,并计算最大面积,直到栈顶元素小于当前的高度,把当前的高度压入栈中。

需要注意的有一下几点:

1.不要忘记最扁的长方形面积,实现方法是在height中push_back一个高度为0的长条。这样不会影响最终结果而且可以保证最后一次计算把栈弹空。

2.如果height[i] == height[i+1]时,我们仍然可以把height[i]向后延伸,因此并不弹出height[i],直接压入height[i+1]。

3.在弹出若干个height小于height[i]元素后,当把height压入栈中的时候,并不是把i当做index压入,而是把最后一个被弹出的index压入,因为在下一次计算面积时这些大于height[i]的长条已经不在栈中了,因此我们需要改变index。

4.每次弹栈时,都要计算最大的面积。

代码如下:

1 class Solution { 2 public: 3 int largestRectangleArea(vector
&height) { 4 height.push_back(0); 5 stack
> h;//height, index 6 int res = 0; 7 for( int i = 0 ; i < height.size() ; i++ ) 8 { 9 pair
tmp;10 if( h.size() == 0 || h.top().first <= height[i])11 {12 h.push(make_pair(height[i], i));13 }14 else15 {16 while(h.size() > 0 && h.top().first > height[i])17 {18 tmp = h.top();19 h.pop(); 20 res = max(res, tmp.first * (i-tmp.second));21 }22 h.push(make_pair(height[i], tmp.second));23 }24 }25 height.pop_back();26 return res;27 }28 };
View Code

 

转载于:https://www.cnblogs.com/jostree/p/4052343.html

你可能感兴趣的文章
jmeter的如何设置headers
查看>>
ssh免密登入
查看>>
Eclipse设置智能提示
查看>>
虚拟化这八年-【软件和信息服务】2014.11
查看>>
使用swfupload上传超过30M文件,使用FLASH上传组件
查看>>
OkHttp简介
查看>>
如何使用通用Mapper
查看>>
MYSQL建表语法(主键,外键,联合主键)
查看>>
多线程的通信和同步(Java并发编程的艺术--笔记)
查看>>
Linux使用du和df查看磁盘和文件夹占用空间
查看>>
CentOS 6.6 MySQL install
查看>>
从零开始用gulp
查看>>
android之Activity的生命周期
查看>>
hadoop2.4 支持snappy
查看>>
STL 笔记(四) 迭代器 iterator
查看>>
2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
查看>>
[LeetCode] Valid Parenthesis String 验证括号字符串
查看>>
各大SRC中的CSRF技巧
查看>>
Docker for Windows 使用入门
查看>>
【Django】Web应用开发经由
查看>>