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.

这题有两个解法,一个暴力O(n^2) 另一个是非常流弊聪明的O(n),两个都花了我很长时间去思考,最后看了这篇博文 才略有所得。
首先暴破在现在看来思路应该是很直观的,但是我当时还是一点头绪没有,故思考良久以后决定去找答案。先来看看暴力法。

min_h = 0
max_a = 0 for i = [0 len){
if (min_h > height[i]) then continue
min_h = height[i]
for j = [i len){
if (min_h > height[j]){
min_h = height[j]
}
max_a = max(max_a, min_h * (j-i+1))
}
}

这是表达思路的伪码,大概就是,以每个柱子为基点,向前依次遍历其余柱子,用当前最短的那根乘上此刻前进的距离来求得面积,同时更新最大面积。这样遍历下来是O(n^2)的,虽然没有遗漏,但是也有很多不必要的枚举。
代码中 if (min_h > height[i]) then continue 这句是我尝试的一个优化,因为如果此趟遍历的高度都不超过前一趟的最小高度的话,这一趟得到的最大面积绝不会比前一趟大。但是这个优化仍是收效甚微,大集合没有通过。
至此也没有想到其他的优化手段,但是确实有人用优化过的暴力方法通过了大集合测试...我战斗力还是没有突破5啊。

暴力完整代码(Time Limit Exeeded):

 int largestRectangleArea(vector<int>height){
int maxArea=, minHeight=;
for (int i=; i<height.size(); i++){
if(height[i] <= minHeight)continue;
minHeight = height[i];
for (int j=i; j<height.size(); j++){
if (height[j] < minHeight){
minHeight = height[j];
}
int curArea = (j-i+) * minHeight;
if (curArea > maxArea){
maxArea = curArea;
}
}
}
return maxArea;
}

下面看看那个非常聪明流弊的O(n)解,还是建议去看一下开头提到的那篇博客,虽然几个图画的有问题,但是不影响理解的。
首先,他用一个栈来维护一个单调递增序列。 即在遍历过程中,遇到比栈顶大的才push。注意栈里保存的是索引。
如果遇到比栈顶小的,pop出栈顶并以他对应的实际数据为height,乘以一个width,求得面积并更新最大面积。那个width就是当前遍历位置i当前栈顶(注意已经pop过一次)的间距(不包括当前栈顶位置)
这样到遍历完成的时候我们就可以得到最大面积,因为每次弹栈,我们都确保了弹出的那个家伙获得了他组成的最大面积。噢,为了确保最后把栈弹空,我们需要在原数据后面加一个dummy的0。

这是AC的:

 int largestRectangleArea2(vector<int>height){
stack<int> s;
int maxArea = ;
int i=;
height.push_back();//dummy
int len = height.size();
while (i < len){
if (s.empty() || height[s.top()] < height[i]){
s.push(i++);
}else {
int h = s.top();
s.pop();
maxArea = max(maxArea, s.empty()? i*height[h] : height[h] * (i - s.top() - ));
}
}
return maxArea;
}

[LeetCode] Largest Rectangle in Histogram的更多相关文章

  1. leetcode Largest Rectangle in Histogram 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052343.html 题目链接 leetcode Largest Rectangle in ...

  2. [LeetCode] Largest Rectangle in Histogram O(n) 解法详析, Maximal Rectangle

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

  3. LeetCode: Largest Rectangle in Histogram 解题报告

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

  4. [LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形

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

  5. LeetCode: Largest Rectangle in Histogram(直方图最大面积)

    http://blog.csdn.net/abcbc/article/details/8943485 具体的题目描述为: Given n non-negative integers represent ...

  6. [leetcode]Largest Rectangle in Histogram @ Python

    原题地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ 题意: Given n non-negative integ ...

  7. leetcode -- Largest Rectangle in Histogram TODO O(N)

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

  8. [LeetCode] Largest Rectangle in Histogram 解题思路

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

  9. LeetCode——Largest Rectangle in Histogram

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

随机推荐

  1. BZOJ 3111: [Zjoi2013]蚂蚁寻路

    Sol DP. 首先观察转折,画画图,看看移动路线,可以非常轻易的发现如果走到起点的下方是回不去的.. 然后它就相当于一个底部是平的,顶部凹凹凸凸的形状,每右转两次或左转两次就会形成小矩阵,这样就可以 ...

  2. UIView的一些基本方法 init、loadView、viewDidLoad、viewDidUnload、dealloc

    init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) ‍init方法中初始化ViewController本身 loadView方法 当view需要被展示而它却是nil时,view ...

  3. C#中 int.TryParse 的用法

    int i = -1;bool b = int.TryParse(null, out i);执行完毕后,b等于false,i等于0,而不是等于-1,切记. int i = -1;bool b = in ...

  4. 数据库Error:The ScriptCollection in ScriptName not find

    System.InvalidOperationException: The ScriptCollection in ScriptName not find 在 WMI.SQL.HELPER.CONFI ...

  5. question2answer论坛框架分析及web开发思考

    2015年7月25日 17:31:42 星期六 一个专门做论坛的开源PHP框架, 有后台, 支持多语种 入口文件是框架根目录的index.php 他包含了/qa-include/qa-index.ph ...

  6. hdu 1014.Uniform Generator 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 题目意思:给出 STEP 和 MOD,然后根据这个公式:seed(x+1) = [seed(x) ...

  7. mysql中Access denied for user 'root'@'localhost' (using password:YES)

    关于昨天下午说的MySQL服务无法启动的问题,解决之后没有进入数据库,就直接关闭了电脑. 今早打开电脑,开始-运行 输入“mysql -uroot -pmyadmin”后出现以下错误: “Access ...

  8. 【leetcode】Set Matrix Zeroes(middle)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 思路:不能用 ...

  9. 【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。

    第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归 ...

  10. 【编程题目】设计包含 min 函数的栈

    2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的 ...