【LeetCode】084. Largest Rectangle in Histogram
题目:
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 heights = [2,1,5,6,2,3],
return 10.
题解:
Solution 1
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.size() < )
return ;
return maxArea(heights, , heights.size() - );
}
private:
int combineArea(vector<int> &heights, int l, int m, int r){
int i = m, j = m;
int area = , h = min(heights[i], heights[j]);
while(i >= l && j <= r){
h = min(h, min(heights[i], heights[j]));
area = max(area, h * (j - i + ));
if(i == l)
++j;
else if(j == r)
--i;
else {
if(heights[i - ] > heights[j + ])
--i;
else
++j;
}
}
return area;
}
int maxArea(vector<int> &heights, int l, int r){
if(l >= r)
return heights[l];
int m = l + (r - l) / ;
int area = maxArea(heights, l, m - );
area = max(area, maxArea(heights, m + , r));
area = max(area, combineArea(heights, l, m, r));
return area;
}
};
Solution 2 摘自geeks ,用到了单调栈的思想
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int res = , area_top = ;
stack<int> s;
int n = heights.size();
int i = ;
for(i = ; i < n;){
if(s.empty() || heights[s.top()] < heights[i]){
s.push(i++);
} else {
int cur = s.top();s.pop();
area_top = heights[cur] * (s.empty() ? i : i - s.top() - );
res = max(res, area_top);
}
}
while(!s.empty()){
int cur = s.top();s.pop();
area_top = heights[cur] * (s.empty() ? i : i - s.top() - );
res = max(res, area_top);
}
return res;
}
};
Solution 3 优化版
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int res = ;
stack<int> s;
int n = heights.size();
heights.push_back();
for(int i = ; i <= n;){
if(s.empty() || heights[s.top()] < heights[i]){
s.push(i++);
} else {
int cur = s.top();s.pop();
int area_top = heights[cur] * (s.empty() ? i : i - s.top() - );
res = max(res, area_top);
}
}
return res;
}
};
Solutin 4 实际上有些类似,不过把栈的空间复杂度转化为求面积时的时间复杂度,实际上花费时间要多,不推荐此做法。
class Solution {
public:
int largestRectangleArea(vector<int> &heights) {
int res = , n = heights.size() - ;
for (int i = ; i < heights.size(); ++i) {
if (i < n - && heights[i] <= heights[i + ]) {
continue;
}
int h = heights[i];
for (int j = i; j >= ; --j) {
h = min(h, heights[j]);
int area = h * (i - j + );
res = max(res, area);
}
}
return res;
}
};
Solution 4 摘自geeks 基于线段树
【LeetCode】084. Largest Rectangle in Histogram的更多相关文章
- 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...
- 【LeetCode】84. Largest Rectangle in Histogram
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- 【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle
问题描述: 84:直方图最大面积. 85:0,1矩阵最大全1子矩阵面积. 问题分析: 对于84,如果高度递增的话,那么OK没有问题,不断添加到栈里,最后一起算面积(当然,面积等于高度h * disPo ...
- 【一天一道LeetCode】#84. Largest Rectangle in Histogram
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...
- 【Lintcode】122.Largest Rectangle in Histogram
题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...
- 【LeetCode】764. Largest Plus Sign 解题报告(Python)
[LeetCode]764. Largest Plus Sign 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...
- 【LeetCode】813. Largest Sum of Averages 解题报告(Python)
[LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- 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 ...
随机推荐
- EasyDSS+EasyNVR实现幼儿园直播/工地直播等分权限观看直播视频的功能
在EasyNVR互联网直播服务器使用说明书中有关于EasyNVR分组的介绍: "EasyNVR的功能定位就是为视频应用层输出视频设备接入/标准视频输出的能力平台层,只做基础的视频通道接入.视 ...
- ASP.NET MVC + ADO.NET EF 项目实战(一):应用程序布局设计
什么叫上下文? 在你设计一个方法的时候,无法直接从方法参数或实例成员(字段或属性)获得的所有信息都是上下文.例如: 当前用户是谁? 刚才提供操作的数据库连接实例从哪里拿到? 这个方法从哪个 View ...
- 【译】前端开发者都应知道的 jQuery 小技巧
回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: // Back to top $('a.top').click(f ...
- 洛谷2704 [NOI2001]炮兵阵地
题目戳这里 Solution 状压DP很好的入门题,用熟练位运算貌似也没那么难. 首先分析一下题目: 看见n=100,m=10,立马就想到了状压,看起来也像DP,所以我们还是采用行号为阶段的状压DP. ...
- Android系统移植与调试之------->MTK 标准编译命令
命令格式:./maketek [option] [project] [action] [modules]Option: -t ,-tee :输出log信息到当前终端 -o , -opt=-- ...
- 求阶乘,输入一个正整数 n,输出n!
#include<stdio.h>int factorial (int n); int main(){ int n; scanf("%d",&n); print ...
- python3 批量缩放图片为iphone5的640*1136以下
try: from PIL import Image, ImageDraw, ImageFont, ImageEnhance except ImportError: import Image, Ima ...
- sql把字符数组转换成表
需求:把字符串1,2,3变成表里的行数据 方法:用自定义函数实现 /* 获取字符串数组的 Table */ from sysobjects where id = object_id('Get_StrA ...
- 淘宝开源平台(taobao-code)使用
偶尔之下翻到的这个东西,瞬间觉得足以解决自己在开发过程中的版本控制问题.就注册了一个试试.先是在度娘上搜寻“淘code”,进入官网之后直接注册.然后构建自己的项目,上传代码就OK了. 一.搜寻“淘co ...
- SpringBoot学习笔记(2):引入Spring Security
SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...