【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 ...
随机推荐
- 研究怎么运用xcode处理常见的调试问题
本文转载至 http://blog.csdn.net/zhuzhihai1988/article/details/7749022 所谓磨刀不误砍柴工,这里菜鸟我在研究怎么运用xcode处理常见的调试问 ...
- x^a=b(mod c)求解x在[0,c-1]上解的个数模板+原根求法
/************************************* 求解x^a=b(mod c) x在[0,c-1]上解的个数模板 输入:1e9>=a,b>=1,1e9>= ...
- PHP 和 AJAX MySQL 数据库实例
HTML 表单 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- HTML使用post方式提交中文内容出现乱码的错误解决方式
今天在做一个例子的时候,使用post方式提交表单,如果有中文的话,在另一个页面显示出来的时候,总是会出现乱码: 但是将提交方式改为get的时候,就不会出现这种错误. 详细错误见下面图片和代码. HTM ...
- They're much closer in spirit to how our brains work than feedforward networks.
http://neuralnetworksanddeeplearning.com/chap1.html Up to now, we've been discussing neural networks ...
- ButterKnife 原理解析
一.使用方法 1.添加依赖. implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewhart ...
- 左侧图片 右侧块的实现方法---解决3像素bug的一种解决方案,不用浮动用绝对定位和margin-left
google的实现方式是: <div class="mw"> <a href="/" id="mlogo"> &l ...
- curl简单封装 get post
Curl.php <?php /** * Class Curl curl简单封装 get post */ class Curl { /** * @brief get请求 * @param $ur ...
- python有哪些关键字?让他自己“吐”出来!
通过调用库来输出!for循环控制! 源代码: import keyword c = 0 for i in keyword.kwlist: print(i) c += 1 代码截图: 哈哈,关键字: F ...
- linux常见命令2
systemctl set-hostname HOSTNAME 在centos7上设置主机名,永久有效 curl -O -L http://www.gnu.org/software/gettext/ ...