【Largest Rectangle in Histogram】cpp
题目:
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.
代码:
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
int ret = ;
const size_t len = height.size();
if (!len) return len;
int *dp_left = new int[len](), *dp_right = new int[len]();
dp_left[] = ;
dp_right[len-] = len-;
// dp_left : record the left most position of height arr that the curr element can reach
for ( size_t i = ; i < len; ++i ){
int left = i;
while ( left> && height[i]<=height[left-] ) left = dp_left[left-];
dp_left[i] = left;
}
// dp_right : vice versa
for ( int i = len-; i >; --i) {
int right = i;
while ( right<len- && height[i]<=height[right+] ) right = dp_right[right+];
dp_right[i] = right;
}
// get the largest rectangle
for ( size_t i = ; i < len; ++i ) ret = std::max( ret, (dp_right[i]-dp_left[i]+)*height[i] );
delete[] dp_left;
delete[] dp_right;
return ret;
}
};
tips:
采用dp的思路,主要参考 http://www.acmerblog.com/largest-rectangle-in-histogram-6117.html
遍历三次:
1. left to right : dp_left[i]数组存放height[i]向左最多能推到哪个位置
2. right to left : dp_right[i]数组存放height[i]向右最多能推到哪个位置
注意,不论是dp_left还是dp_right存放都是height数组的绝对位置(一开始dp_right一直存放相对位置,导致不能AC)
这里虽然for循环中又有while循环,但是复杂度并不是O(n²),原因并不是一个挨着一个跳的,而是用之前比较的结果(dp_left,dp_right)跳的。
3. 最后走一遍dp,记录最大值
==========================================
自己找虐,又去追了一下stack的解法。自己写了很久并没有通过,学习了下网上的代码。
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
int ret = ;
height.push_back();
stack<int> sta;
for ( int i = ; i < height.size(); )
{
if ( sta.empty() || height[i]>height[sta.top()] )
{
sta.push(i++);
}
else
{
int tmp = sta.top();
sta.pop();
ret = std::max( ret, height[tmp]*(sta.empty() ? i:i-sta.top()- ));
}
}
return ret;
}
};
核心思想就是:维护一个递增的stack。
1. 一旦遇到不能维持递增stack的元素了,就逐个往外弹出,直到能压进去。
2. 往外弹一个元素,就意味着这个元素不能再留着了,因此就计算一下包含弹出的这个元素在内,最大的rectangle是多少。
这里可能有一个疑问:把这个元素弹出来,那万一这个元素跟后面的元素能配上,获得更大大面积了呢?
这个是不可能发生的,因为这个元素能弹出来,必然是在其后面遇上了比它小的元素(阻断了被弹出的元素与后面的联系),因此这种算法是合理的。完毕。
===============================================
第二次过这道题,只记得用递增的stack来做了。
(1)stack里面存的是元素的下标
(2)先弹出来栈顶的元素,再看新的栈顶的元素(刚弹出来的这个元素往前能推到哪里)
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
if (height.size()==) return ;
height.push_back();
int ret = ;
stack<int> sta;
for ( int i=; i<height.size(); ++i )
{
if ( sta.empty() || height[sta.top()]<height[i] )
{
sta.push(i);
}
else
{
while ( !sta.empty() && height[sta.top()]>=height[i] )
{
int tmp = sta.top();
sta.pop();
if ( sta.empty() )
{
ret = max(ret, i*height[tmp]);
}
else
{
ret = max(ret, (i-sta.top()-)*height[tmp]);
}
}
sta.push(i);
}
}
return ret;
}
};
【Largest Rectangle in Histogram】cpp的更多相关文章
- 【LeetCode】84. Largest Rectangle in Histogram
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- Java for LeetCode 084 Largest Rectangle in Histogram【HARD】
For example, Given height = [2,1,5,6,2,3], return 10. 解题思路: 参考Problem H: Largest Rectangle in a Hist ...
- 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...
- LeetCode 笔记系列 17 Largest Rectangle in Histogram
题目: Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar he ...
- 47. Largest Rectangle in Histogram && Maximal Rectangle
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- leetcode Largest Rectangle in Histogram 单调栈
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052343.html 题目链接 leetcode Largest Rectangle in ...
- 关于LeetCode的Largest Rectangle in Histogram的低级解法
在某篇博客见到的Largest Rectangle in Histogram的题目,感觉蛮好玩的,于是想呀想呀,怎么求解呢? 还是先把题目贴上来吧 题目写的很直观,就是找直方图的最大矩形面积,不知道是 ...
- leetcode之Largest Rectangle in Histogram
问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...
- LeetCode之“动态规划”:Maximal Square && Largest Rectangle in Histogram && Maximal Rectangle
1. Maximal Square 题目链接 题目要求: Given a 2D binary matrix filled with 0's and 1's, find the largest squa ...
随机推荐
- jQuery判断元素离页面顶部的高度
<script language="javascript" type="text/javascript"> jQuery(document).rea ...
- jQuery bind and unbind (绑定和解除)
测试:页面代码: <body> <input type="button" name="aaa" value="点击我"&g ...
- Check Box Select/Deselect All on Grid
The below function is to be used on a grid with multiple check boxes. Place the code behind a FieldC ...
- ThinkPHP之中的验证码的小示例
ThinkPHP之中已经封装好了验证码的调用,但是关于手册,缺失了HTML之中以及.实际操作之中的点击ajax就会刷新验证码ajax代码:现在分享一下:看客老爷们注意啦! 放大招啦!!!三分归元气-- ...
- Java实现猜数游戏
利用Math.random()方法产生1~100的随机整数,利用JOptionPane.showInputDialog()方法产生一个输入对话框,用户可以输入所猜的数.若所猜的数比随机生成的数大,则显 ...
- 4)Java容器类相关知识
1>Array 和 Arrays: Arrays:用来操作array的工具类,其中包含一组static函数: equals():比较两个array 是否相等. array拥有相同元 ...
- How to using x++ code create GL journal[AX2012]
static void FAN_GLImport(Args _args) { AxLedgerJournalTable header = new AxLedgerJournalTable(); AxL ...
- Oracle 直方图实例测试
--创建表 SQL> create table tab (a number, b number); Table created. --插入数据 SQL> begin .. loop ins ...
- jqueryMobile应用第一课《构建跨平台APP:jQuery Mobile移动应用实战》连载一(Hello World)
有人说每个程序员都曾经有过改变世界的梦想,笔者认为,这与程序员年轻时编写的第一个程序有着莫大的关系.简简单单的一句“hello world”让年轻的心开始相信梦想,用一种低调的壮志凌云向世界展示自己的 ...
- Rails学习:create操作 局部模板
学习Ruby on Rails实战真经 里面说rails4使用了strong parameters, 所以代码这么写:注意不是Event.new(params[:event])了,而是参数是函数返回值 ...