题目:

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

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

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

  2. 【LeetCode】84. Largest Rectangle in Histogram

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

  3. 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  4. 【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle

    问题描述: 84:直方图最大面积. 85:0,1矩阵最大全1子矩阵面积. 问题分析: 对于84,如果高度递增的话,那么OK没有问题,不断添加到栈里,最后一起算面积(当然,面积等于高度h * disPo ...

  5. 【一天一道LeetCode】#84. Largest Rectangle in Histogram

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...

  6. 【Lintcode】122.Largest Rectangle in Histogram

    题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...

  7. 【LeetCode】764. Largest Plus Sign 解题报告(Python)

    [LeetCode]764. Largest Plus Sign 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...

  8. 【LeetCode】813. Largest Sum of Averages 解题报告(Python)

    [LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

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

随机推荐

  1. js的new到底干了啥 -

    javascript通过new操作符构建一个对象的步骤 <Javascript高级程序设计>的解释: 创建一个对象 将构造函数的作用域赋给新对象(把新对象作为构造函数的调用上下文,也就是t ...

  2. Android笔记之使用ZXing扫描二维码

    ZXing发布版下载地址:https://github.com/zxing/zxing/releases 为了能让官方Demo跑起来,先把ZXing核心部分core复制到自己的工程里 还要把andro ...

  3. 洛谷 4035 [JSOI2008]球形空间产生器

    题目戳这里 一句话题意 给你 n+1 个 n 维点,需要你求出这个n维球的球心.(n<=10) Solution 这个题目N维的话确实不好想,反正三维就已经把我搞懵了,所以只好拿二维类比. 首先 ...

  4. 编程算法 - 最好牛线(Best Cow Line) 代码(C)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/37909933 最好牛线(Best Cow L ...

  5. ICCV 2015 B-CNN细粒度分类

    哈哈,好久没写博客了....最近懒癌发作~~主要是因为心情不太好啊,做什么事情都不太顺心,不过已经过去啦.最近一直忙着公司的项目,想用这个网络,就给大家带来了的这篇文章.可能比较老,来自ICCV 20 ...

  6. git入门篇-----本地操作

    一 ,git的简介 1 ,git的历史 概念性的知识,大家百度一下,就会出现好多优秀的文章供参考,这里我就不多说了. 如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好 ...

  7. xutils3文件上传、下载、get、post请求

    @ContentView(R.layout.activity_xutils3_net) public class XUtils3NetActivity extends Activity { @View ...

  8. KinedEditor特性

    谷歌浏览器会将kindeditor在其他js文件加载完之后加载 kindeditor是异步加载,document.ready完了,kindeditor可能还没加载完 kind会将选区变成一个节点 1. ...

  9. 【leetcode刷题笔记】Subsets II

    Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...

  10. Python 3 mysql 表操作

    Python 3 mysql 表操作 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为 ...