【leetcode刷题笔记】Largest Rectangle in Histogram
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的更多相关文章
- 刷题84. Largest Rectangle in Histogram
一.题目说明 题目84. Largest Rectangle in Histogram,给定n个非负整数(每个柱子宽度为1)形成柱状图,求该图的最大面积.题目难度是Hard! 二.我的解答 这是一个 ...
- 【leetcode刷题笔记】Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- LeetCode(84) Largest Rectangle in Histogram
题目 Given n non-negative integers representing the histogram’s bar height where the width of each bar ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
随机推荐
- 将NSArray反向排序
NSArray * array = [NSArray arrayWithObjects:", nil]; NSArray * reverseArray = [[array reverseOb ...
- Android事件的分发
1 http://blog.csdn.net/guolin_blog/article/details/9097463 2
- mysql用merge合并表
merge合并表的要求 1.合并的表使用的必须是MyISAM引擎 2.表的结构必须一致,包括索引.字段类型.引擎和字符集 实例: create table if not exists user1( i ...
- 介绍C#结构体与类区别
1. 结构体与类定义方式 结构体定义使用struct类定义使用class 结构体: struct testDemo{ int num; void action(){ } } 类: class test ...
- 用unity3d实现简单的主server连接
用unity3d实现简单的主server连接 參考自鹰大的网络实例 -------------------------------------------------华丽的切割线----------- ...
- WebLogicSSL解决苹果IOS itms下载问题
前提: 安装好openssl工具. 通过windows cmd 命令进入 openssl工作文件夹 如解压文件夹为:E:\ openssl-1.0.2-beta1 则工作文件夹为E:\openssl- ...
- 借助Anyproxy实时监控接口调用次数和流量
监控接口调用次数,是为了测试客户端可能会异常频繁的调用服务端接口,出现性能问题. AnyProxy是一个开放式的HTTP代理服务器. github: https://github.com/alibab ...
- Verilog 浮点数运算模块
算法中常常会到浮点数运算,而浮点数的处理常常是Verilog初学中常常遇到的问题.以下将就一个简单的例子说明Verilog中浮点数运算处理. 在JPEG图像压缩时遇到色彩空间变换的问题,将YCbCr转 ...
- ROS多个网段做隔离
ROS路由器有多个LAN口,网段分别是 192.168.0.0/24 和 192.168.1.0/24. 用192.168.1.0/24做为访客使用,因此在路由器上面设置过滤器. /ip firewa ...
- Android学生管理系统
现在要做这么一个小的demo,可以添加.展示,并且在添加完了之后刷新列表内容. 要点: 在代码中给线性布局添加View 让控件滚动,放到ScrollView中 保存数据就是把数据保存到本地,然后恢复的 ...