84. Largest Rectangle in Histogram (Array, Stack; DP)
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.
法I: 使用动态规划
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int* l = new int [height.size()]; //状态:向左连续的>=height[i]的最后一个位置
int* r = new int [height.size()]; //状态:向右连续的>=height[i]的最后一个位置
l[0]=0;
for( int i =1; i <height.size(); i++) //从左往右扫描
{
if(height[i]==0)
{
l[i] = 0;
continue;
}
int j = i-1;
for(; j >= 0; j--){
if(height[i] <= height[j]) j = l[j]; //用动态规划求l[i]否则会Time Limit Exceeded
if(height[i] > height[j]) break;
}
l[i] = j+1;
}
r[height.size()-1]=height.size()-1;
for(int i =height.size()-2; i >=0; i--){ //从右往左扫描
if(height[i]==0)
{
r[i] = 0;
continue;
}
int j = i+1;
for(; j <height.size(); j++){
if(height[i] <= height[j]) j = r[j]; //动态规划
if(height[i] > height[j]) break;
}
r[i] = j-1;
}
int area;
int largestArea = 0;
for(int i = 0; i< height.size(); i++)
{
area = (r[i]-l[i]+1) * height[i];
if(area>largestArea) largestArea = area;
}
return largestArea;
}
};
法I的空间负责度是O(n)+O(n), 为了节省空间,可以用stack代替array来存储最高高度的位置。
法II: stack的栈顶元素表示下一个用来计算面积的高度。
进栈条件:当前元素比栈顶元素大或相等, 进栈后 i++
出栈条件:当前元素比栈顶元素小,出栈后 计算面积 i不变(每个元素都要进一次栈,i要等到比自己小的栈顶元素,然后进栈)
为什么要在此时计算面积?
这个高度到i位置截至了,无法往有再延伸,所以要在当下计算面积。
如何界定计算面积时的左界和右界?
- 左界=新栈顶元素+1
- 右界=当前位置-1
为什么可以这样?
从新栈顶到i的元素高度都>=height[idx],因为如果其中有<height[idx]的元素,那么idx早就出栈了。
空间复杂度最坏情况也只有O(n)
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if(height.size() == ) return ;
int res = ;
stack<int> idxStack;
height.push_back(); //为了如果在最后height高于栈顶元素,能够再进一次else,把stack中的元素pop出来计算
int i = ;
int idx;
int width;
while(i < height.size())
{
if(idxStack.empty() || height[i] >= height[idxStack.top()]){ //当前高度>=栈顶高度
idxStack.push(i); //入栈
i++;
}
else{ //高度降低了
idx = idxStack.top();
idxStack.pop(); //出栈
width = idxStack.empty() ? i : (i-idxStack.top()-); //界定左右边界
res = max(res, height[idx] * width); //计算面积,并更新最大面积
}
}
height.pop_back();
return res;
}
};
84. Largest Rectangle in Histogram (Array, Stack; DP)的更多相关文章
- 84. Largest Rectangle in Histogram
https://www.cnblogs.com/grandyang/p/4322653.html 1.存储一个单调递增的栈 2.如果你不加一个0进去,[1]这种情况就会输出结果0,而不是1 3.单调递 ...
- 刷题84. Largest Rectangle in Histogram
一.题目说明 题目84. Largest Rectangle in Histogram,给定n个非负整数(每个柱子宽度为1)形成柱状图,求该图的最大面积.题目难度是Hard! 二.我的解答 这是一个 ...
- 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...
- LeetCode 84. Largest Rectangle in Histogram 单调栈应用
LeetCode 84. Largest Rectangle in Histogram 单调栈应用 leetcode+ 循环数组,求右边第一个大的数字 求一个数组中右边第一个比他大的数(单调栈 Lee ...
- 【LeetCode】84. Largest Rectangle in Histogram
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- 84. Largest Rectangle in Histogram *HARD* -- 柱状图求最大面积 85. Maximal Rectangle *HARD* -- 求01矩阵中的最大矩形
1. Given n non-negative integers representing the histogram's bar height where the width of each bar ...
- [LeetCode#84]Largest Rectangle in Histogram
Problem: Given n non-negative integers representing the histogram's bar height where the width of ea ...
- 84. Largest Rectangle in Histogram(直方图最大面积 hard)
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- [LeetCode] 84. Largest Rectangle in Histogram 直方图中最大的矩形
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
随机推荐
- shell 1基础
shell简介 shell是一个用C语言编写的程序,是用户使用Linux的桥梁.shell既是一种命令语言,又是一种程序设计语言. shell脚本(shell script),是一种为shell编写的 ...
- mysql binlog协议分析--具体event
这几天在修改canal, 连接mysql和maria接收到的event有所区别 拿一个简单的insert sql来举例 mysql 会有以下几个event写入到binlog里 1.ANONYMOUS_ ...
- 1053 Path of Equal Weight (30 分)
Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weig ...
- jquery的相关应用
1.jQuery获取鼠标事件源(万能) 1 //任意位置 2 3 $(document).ready(function(){ 4 5 $(document).click(function(){ 6 $ ...
- Android RIL Architecture
Android RIL Architecture by Gomathi Sankar Introduction The Article explains about the buildin ...
- xgCalendar在ASP.NET中的使用
1.将wdCalendar文件夹考入项目中 2.在页面中添加引用,见3中head标签中定义 3.配置xgCalendar,两段代码放在一起就是完整的页面 body> <div> &l ...
- docker容器修改时区(java应用log信息与标准容器时间有八个小时时间差)
在docker容器中运行的java应用打出的日志时间和通过date -R方式获取的容器标准时间有八个小时时间差- 因为docker容器的原生时区为0时区,为了和国内时区保持一致,需要把容器时区调为东八 ...
- ElasticSearch 索引模块——集成IK中文分词
下载插件地址 https://github.com/medcl/elasticsearch-analysis-ik/tree/v1.10.0 对这个插件在window下进行解压 用maven工具对插件 ...
- BAT脚本编写教程(比较易懂和全面)
这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人 作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...
- web本质
知识内容: 1.网络协议复习 2.模拟web 3.web本质总结 参考: http://www.cnblogs.com/wupeiqi/articles/5237672.html http://www ...