题目:

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的更多相关文章

  1. 【LeetCode】84. Largest Rectangle in Histogram

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  2. 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 ...

  3. 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...

  4. LeetCode 笔记系列 17 Largest Rectangle in Histogram

    题目: Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar he ...

  5. 47. Largest Rectangle in Histogram && Maximal Rectangle

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  6. leetcode Largest Rectangle in Histogram 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052343.html 题目链接 leetcode Largest Rectangle in ...

  7. 关于LeetCode的Largest Rectangle in Histogram的低级解法

    在某篇博客见到的Largest Rectangle in Histogram的题目,感觉蛮好玩的,于是想呀想呀,怎么求解呢? 还是先把题目贴上来吧 题目写的很直观,就是找直方图的最大矩形面积,不知道是 ...

  8. leetcode之Largest Rectangle in Histogram

    问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...

  9. 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 ...

随机推荐

  1. 必须会的SQL语句(一) 创建数据库与删除数据库

    1.创建数据库   Create database 名称 on primary {    name ='名称',    filename ='c:\xx\名称.mdf',    size = 10mb ...

  2. linux安装ftp服务器

    Ftp(文件传输协议) 概念 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用 ...

  3. ASP.NET中Button控件的CommandName和CommandArgument属性用法

    在Repeater中的使用: <asp:Repeater ID="rptActionList" runat="server" OnItemCommand= ...

  4. Web前端性能优化的9大问题

    1.请减少HTTP请求基本原理:在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出.一个正常HTTP请求的流程简述:如在浏览器中输入&qu ...

  5. css基础学习

    css(Cascading style sheets):层叠样式表 1.图片替换技术 以下代码表示:点击百度logo的图片就会跳转到百度首页. <style > .baidu{ /*宽高定 ...

  6. luigi学习8--使用中央调度器

    --local-scheduler一般用在开发阶段,这在一个产品中是不建议这样使用的.使用中央调度器有两个目的: 保证两个相同的task不会同时运行两次 提供一个可视化的界面 注意:中央调度器并不会帮 ...

  7. phpQuery采集微信公众号文章乱码

    终于找到解决方案了,这是一个值得庆祝的事情.... 原来是因为微信在源码中加入了防采集代码<!--headTrap<body></body><head>< ...

  8. php中的占位符

    1.?这种形式传值,注意是数组! 2.:name的形式.

  9. 最新中国IP段获取办法与转成ROS导入格式

    获取中国IP段办法     1.到APNIC获取亚太最新IP分配 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest     2 ...

  10. Oracle Database Cloud Services

    Oracle 开始也把数据库服务作为PaaS 服务,好吧 Oracle 叫做 DBaaS,数据库服务 https://cloud.oracle.com/database?tabID=138367891 ...