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.


题解:在网上研究了好久才弄懂。

首先,需要一个栈,栈里面存放每个条的索引,当当前的元素大于栈顶的元素或者栈为空时,将当前元素入栈;

当当前元素小于栈顶元素的时候,将栈顶元素弹出来,索引记录在top变量上,那么还有两种可能:

  • 栈不为空,如下图所示,从栈顶的条到top所指的条(当前出栈的条)的高度一定大于等于top的高度(否则它们应该还在栈里面),一共有(top-栈顶索引-1)个条,而top~i这一段的高度也一定大于等于top的高度(否则指针不会有top刚出栈而指针已经移动到i),一共有(i-top)个条(包括top自己),所以top所能向左和向右到达的最大延伸长度为(top-栈顶索引-1)+(i-top)=(i-栈顶索引-1),产生的最大面积为height[top] * (i-栈顶索引-1) 。

  • 栈为空,如下图所示,说明top所指的条(当前出栈的条)向左延伸可以到达最左边,向右延伸可以到达i,一共有 i 个条,产生的最大面积为height[top] * i。

所以当元素top出栈的时候,它所能产生的最大面积为 height[top] * (stack.isEmpty()?i:i-stack.top()-1) 。

总结一下栈的意义,对于为位置 i 处的条来说,栈中存放的元素是可以一路“延展”至 i 的条,所以它们都比 i 小,都可以利用 i 来增加自己产生的矩形的最大面积,而那些比 i 高的条已经不能通过 i 继续往右延展了,即它们往右能够延展到的部分已经被 i 阻拦了,我们就可以计算它们此时已经左右延展的距离来计算它们所能产生的矩形的最大面积了。比如下图中i = 4的时候,红色的条已经不能通过4继续往右扩展,它往右扩展被4给挡住了,所以它要出栈,而绿色的条比4矮,它仍然可以利用4增大它产生的矩形的面积,所以它不需要出栈,因为我们还没确定它的右边界。

最后,有两点trick:

  • 一是比如上图的情况,遍历完成后,绿色的条还在栈里面,所以我们要在所有的条最后增加一个长度为0的条,它可以把栈中所有的条都弹出来,我们就得到了所有的条能够产生的最大矩形的面积了。
  • 二是在有元素弹出栈后,i 指针要保持不动,因为有可能它前面的元素也比 i 指向的条矮,需要出栈。

代码如下:

 public class Solution {
public int largestRectangleArea(int[] height) {
if(height == null || height.length == 0)
return 0;
Stack<Integer> index = new Stack<Integer>();
int totalMax = 0;
ArrayList<Integer> newHeight = new ArrayList<Integer>();
for(int i:height) newHeight.add(i);
newHeight.add(0); for(int i = 0;i < newHeight.size();i++){
if(index.isEmpty() || newHeight.get(i) >= newHeight.get(index.peek()))
index.push(i);
else{
int top = index.pop();
totalMax = Math.max(totalMax,newHeight.get(top) * (index.isEmpty()?i:i-index.peek()-1));
i--;
}
} return totalMax;
}
}

【leetcode刷题笔记】Largest Rectangle in Histogram的更多相关文章

  1. 刷题84. Largest Rectangle in Histogram

    一.题目说明 题目84. Largest Rectangle in Histogram,给定n个非负整数(每个柱子宽度为1)形成柱状图,求该图的最大面积.题目难度是Hard! 二.我的解答 这是一个 ...

  2. 【leetcode刷题笔记】Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  3. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  4. LeetCode(84) Largest Rectangle in Histogram

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

  5. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  6. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  7. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  8. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  9. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

随机推荐

  1. android tooggle button

    1 http://stackoverflow.com/questions/9938315/toggle-button-in-iphone-style 2 http://blog.csdn.net/bi ...

  2. requests ssl 报错

    使用requests下载日志出现HTTPSConnectionPool(host='***', port=443): Max retries exceeded with url: ******(Cau ...

  3. MySQL加入服务、设置password、改动password

    修正:加入MySQL服务时,能够不带版本.也就说以下的全部MySQL57能够直接写成MySQL!希望大家注意. MySQL安装好之后,往往还须要再做一些设置! 1.加入MySQL服务: 输入命令cmd ...

  4. ArrayList remove注意事项

    例子1: List<Integer>list=new ArrayList<>(); list.add(1); list.add(2); list.add(2); list.ad ...

  5. iOS swift 给MBProgressHUD添加分类

    MBProgressHUD在开发中经常会用到,今天把MBProgressHUD的方法拓展了一下,更加方便使用 1.可以实现gif图片的展示,使用时请替换test.gif 2.可以控制是否允许交互,如果 ...

  6. struts2 拦截器,使用spring注入

    ActionContext actionContext = invocation.getInvocationContext();ServletContext context = (ServletCon ...

  7. ubuntu中文乱码--添加中文字符集

    在Ubuntu支持中文后(方法见上篇文章),默认是UTF-8编码,而Windows中文版默认是GBK编码.为了一致性,通常要把Ubuntu的默认 编码改为GBK.当然你也可以不改,但这会导致我们在两个 ...

  8. onInterceptTouchEvent和onTouchEvent调用时序(转)

    onInterceptTouchEvent和onTouchEvent调用时序 onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个c ...

  9. Hadoop环境搭建2_hadoop安装和运行环境

    1 运行模式: 单机模式(standalone):  单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置.在这种默认模式下所有 ...

  10. python 基础 9.7 创建表

    一. 创建表 #/usr/bin/python #-*- coding:utf-8 -*- #@Time   :2017/11/22 18:05 #@Auther :liuzhenchuan #@Fi ...