题目:

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. 【转】AC神组合数取模大全

    貌似少了几张图片,不过没有图片也没什么关系的感觉. 最后的究极篇也想出来了,但是貌似找不到题目,好尴尬.. 这个表示的是从n个元素中选取m个元素的方案数. (PS.组合数求模似乎只用在信息学竞赛和 A ...

  2. 在VS2017环境中编译libxml2库

    libxml2库编译 1.下载libxml2,官网是:http://www.xmlsoft.org/downloads.html, 我下载的版本是:libxml2-sources-2.9.7.tar. ...

  3. django 异步任务实现及Celery beat实现定时/轮询任务

    Celery定时任务 requirements celery==3.1.25 异步任务 django-celery==3.2.2 定时任务管理包 redis==2.10.6 django-redis- ...

  4. virt-v2v 使用指南

    virt-v2v 使用指南 1.定义. virt-v2v将外部的虚拟化平台上的虚拟机转化到可以运行的KVM平台上.它可以读取在VMware.Xen运行Hyper-V和其他虚拟机管理程序上的Window ...

  5. Xen虚拟化基础篇

    一.xen的简介 Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(& ...

  6. R语言数据管理(二):模式与类

      最常用的4种数据类型是数值型(numeric).字符型(character)(字符串).日期型(Date)或POSIXct(基于日期的).逻辑型(logical)(TRUE或FALSE). 变量中 ...

  7. Python 可变长度函数参数

    func( *tuple_grp_nonkw_args, **dict_grp_kw_args ) 在编程的过程中,我们可能会遇到函数参数个数不固定的情况.这时就需要使用可变长度的函数参数来实现我们的 ...

  8. 隐藏c语言烦人的{ }

    .vimrc文件中添加 autocmd BufNewFile,BufRead * :syn match braces conceal "[{}]" set conceallevel ...

  9. IE盒模型和标准盒模型

    标准盒模型和ie盒模型(怪异盒模型) w3c标准盒模型 width和height不包括padding和border ie盒模型 width和height包含padding和border ie8以上都是 ...

  10. 3像素文本偏移bug 解决方案

    <style>.box1{ width:100px; height:50px; float:left; background:#dedede;_margin-right:-3px;}.bo ...