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 ...
随机推荐
- java web 程序---缓冲代码
在写验证码的时候,我的验证码是随机的,所以每次点击时,刷新页面,验证码都会改变. 可是,当我点击刷新时,验证码不变,说明,没有缓冲. 这里差三行代码. response.setHeader(" ...
- 学习笔记之C/C++指针使用常见的坑
https://mp.weixin.qq.com/s/kEHQjmhNtSmV3MgHzw6YeQ 避免内存泄露 不再用到的内存没有释放,就叫做内存泄露 在C/C++中,通过动态内存分配函数(如mal ...
- [转]链接中 href='#' 和 href='###' 的区别以及优缺点
本文来自:http://c.jinhusns.com/bar/t-829 链接中 href='#' 和 href='###' 的区别以及优缺点 上一篇 下一篇近乎_问阳 发表于:2013-09-09 ...
- date的讲解及分析
Date() 对象(获取时间的) 不过是用类的写法来实现的:(他也没有私有属性,都是通过__proto__继承来的) Date() 分两大系 一个是get系列(及获取时间) 一 ...
- javascript讲解
1. js介绍 js的全称 javascript 由布兰登 艾奇发明的 javascript和java是有区别的 javascript是一门前台语言,而Java 是后台语言 前台语言运行在客户 ...
- Robot常用Library安装
Python-Library: yum install -y mysql-devel python-devel python-setuptools pip install MySQL-python p ...
- [UE4]添加机器人
跟玩家角色一样,机器人也是继承自“Character”,动画蓝图也是跟角色玩家的一样,区别是机器人要使用“AIController”来控制
- Windows10 命令行中使用网络驱动器
Windows10中,我们在局域网内使用共享文件夹,建立映射的网络驱动器,有时候需要一些软件去调用网络驱动器内的资源,但是发现在资源管理器能正常打开,应用软件却无法识别,命令行中提示:“系统找不到指定 ...
- redis入门之jedis
jedis是redis官方首选的java客户端开发包 开源托管地址:https://github.com/xetorthio/jedis 下载地址,以及maven, 依赖参考: 下面来编写一段程序进行 ...
- position属性详解
内容: 1.position属性介绍 2.position属性分类 3.relative相对定位 4.absolute绝对定位 5.relative和absolute联合使用进行定位 6.fixed固 ...