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. Struts2学习小结

    1 基础 使用:导入 jar 包,配置 web.xml,并引入 struts.xml 文件 DMI:动态方法调用,调用时使用!分隔 action 名与方法名,如 index ! add.action, ...

  2. curl测试Docker容器连通性

    通过curl来测试docker对外访问是否正常,这里测试Docker tomcat容器访问: [root@mysqlserver ~]# curl http://172.17.0.8:8080 < ...

  3. H265 Rtp封包

    H265 Rtp封包可以参考Ffmpeg,具体实现在文件rtpenc_h264_hevc.c(4.0.1版本),核心的方法是nal_send 这个方法有些绕,下面帖子具体的代码及注释. static ...

  4. VBA 按列查找小工具类似lookUp函数

    如上图,查找A列的数据在D,F列是否存在,如果存在背景色变绿,如果不存在则A列的背景色变红. 直接贴上代码: Private Sub CommandButton1_Click() Call lookU ...

  5. tensorflow-gpu 1.13 提示找不到 libcublas.so.10.0 的问题

    tensorflow-gpu 使用 1.13.1,cuda-10-0已安装好,但启动时依然报错 ImportError: libcublas.so.10.0: cannot open shared o ...

  6. RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解决方案(转)

    转自:RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解 ...

  7. python 3 关于requests库的 text / content /json

    最近在爬SDFDA的数据,刚开始用urllib.request 库,一直连不到数据 : 后来通过CHROME浏览器的F12,发现该 网站用的是JSON格式{}'Content-Type': 'appl ...

  8. vue prop不同数据类型(数组,对象..)设置默认值

    vue prop 会接收不同的数据类型,这里列出了 常用的数据类型的设置默认值的写法,其中包含: Number, String, Boolean, Array,  Function, Object   ...

  9. 在ListView的GroupItem头中显示每列的Summary

    问题描述 WPF自带的ListView和DataGrid控,都提供了数据分组的支持,并可以对分组的Header进行自定义.但是,如果想在每个分组的Header中,显示出本分组的"小计&quo ...

  10. poj3708(公式化简+大数进制装换+线性同余方程组)

    刚看到这个题目,有点被吓到,毕竟自己这么弱. 分析了很久,然后发现m,k都可以唯一的用d进制表示.也就是用一个ai,和很多个bi唯一构成. 这点就是解题的关键了. 之后可以发现每次调用函数f(x),相 ...