题目:最大的矩形柱状图

难度:hard

题目内容

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.

翻译

给定n个非负整数表示直方图的杆高度,其中每个条的宽度为1,找出直方图中最大矩形的面积。


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.

我的思路:对每个元素都向两边进行搜索,如果高度大于它面积就+它,最后取最大。

我的代码

     public int largestRectangleArea(int[] height) {
int max = 0;
for (int i = 0; i < height.length; i++) {
max = Math.max(max, getArea(height, i));
}
return max;
}
private int getArea(int[] height, int i) {
int area = height[i];
for (int j = i+1; j < height.length; j++) {
if (height[j] >= height[i]) {
area += height[i];
} else {
break;
}
}
for (int j = i-1; j > -1; j--) {
if (height[j] >= height[i]) {
area += height[i];
} else {
break;
}
}
return area;
}

我的复杂度:O(N2)  空间复杂度O(1)

编码过程中的问题

1、之前只往后面搜索没有往前;

2、方法复杂度太高,须优化。

答案代码

     public int largestRectangleArea(int[] height) {
int len = height.length;
Stack<Integer> s = new Stack<Integer>();
int maxArea = 0;
for(int i = 0; i <= len; i++){
int h = (i == len ? 0 : height[i]);
if(s.isEmpty() || h >= height[s.peek()]){
s.push(i);
}else{
int tp = s.pop();
maxArea = Math.max(maxArea, height[tp] * (s.isEmpty() ? i : i - 1 - s.peek()));
i--;
}
}
return maxArea;
}

答案复杂度:O(N)  空间复杂度O(N)

答案思路

思路理解了半天,表示很难想到,那就直接解释好了:

利用一个栈,“递增”的块则直接压入栈中,否则(停止递增时),则将栈顶出栈,乘以上一个比他矮的下标(也就是它出栈后的栈顶)与当前指针的高度,

这样就能表示当前指针的“前一个比它高的块”的最大面积,与最大值比较之后,需要将指针 i 再-1,用来继续探测当前指针“前一块比它高的”。(从下标0一直判断到length,当下标为length的时候,高度为0

特殊情况

出栈后,栈内已经为空的时候,说明从最开始(下标 0),到目前为止(下标 i 的前一个),最低点就是刚刚出栈的那一个。所以此时只需要直接用此高度乘以  i  即可(相当于出栈后的栈顶是 - 1)。

示例:【2,1,3,5】

下标  操作

0  栈内空,0入栈(注意,入栈的是下标,取出来比较的时候要写成height[stack.peek()])。此时栈内【0】

1  1比栈顶下标0所表示高度2小,下标0出栈,栈空(前面比2小的没了),所以 area = 2 * i = 2;此时栈内【空】

   继续判断,栈空,1入栈。此时栈内【1】

2  3比栈顶1所示高度1大,下标2入栈。此时栈内【1,2】

3  5比栈顶2所示高度3大,下标3入栈。此时栈内【1,2,3】

4  0比栈顶3所示高度5小,下标3出栈,栈顶为2(前面比高度5矮的下标2的那个),所以 area = 5 * (4-2-1) = 5;此时栈内【1,2】

   继续判断,0比栈顶2所示高度3小,下标2出栈,栈顶为1(前面比高度3矮的是的下标1的那个),所以 area = 3 * (4-1-1) = 6;此时栈内【1】

   继续判断,0比栈顶1所示高度1小,下标1出栈,栈为空,所以 area = 1 * i = 4;此时栈内【空】

   继续判断,栈空,0入栈。此时栈内【0】

综上取最大area =》 6

LeetCode第[84]题(Java):Largest Rectangle in Histogram(最大的矩形柱状图)的更多相关文章

  1. leetCode 84.Largest Rectangle in Histogram (最大矩形直方图) 解题思路和方法

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

  2. 73.Largest Rectangle in Histogram(最大矩形)

    Level:   Hard 题目描述: Given n non-negative integers representing the histogram's bar height where the ...

  3. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

    题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的 ...

  4. 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...

  5. LeetCode 84. Largest Rectangle in Histogram 单调栈应用

    LeetCode 84. Largest Rectangle in Histogram 单调栈应用 leetcode+ 循环数组,求右边第一个大的数字 求一个数组中右边第一个比他大的数(单调栈 Lee ...

  6. 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 ...

  7. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

    84. 柱状图中最大的矩形 84. Largest Rectangle in Histogram

  8. 刷题84. Largest Rectangle in Histogram

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

  9. 【LeetCode】84. Largest Rectangle in Histogram

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

随机推荐

  1. 怎样将Arranged_2压入General_Polygon_set_2中

    Thursday, March 14, 2013 How to Jam an Arrangement_2 into a General_polygon_set_2 I spent about thre ...

  2. HDU2425:Hiking Trip(简单bfs,优先队列实现)

    题目: 传送门 题意很简单就不解释了,水题一道. #include <iostream> #include <string.h> #include <stdio.h> ...

  3. Go实现查找目录下(包括子目录)替换文件内容

    [功能] 按指定的目录查找出文件,如果有子目录,子目录也将进行搜索,将其中的文件内容进行替换. [缺陷] 1. 没有过滤出文本文件 2. 当文件过大时,效率不高 [代码] package main i ...

  4. shiro 密码如何验证?

    Authentication:身份认证/登录,验证用户是不是拥有相应的身份. Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是否能做事情. 这里我们主要 ...

  5. C++关联式容器的排序准则

    stl中set和map为关联式容器,会根据排序准将元素自动排序.原型如下: template<class _Kty, class _Pr = less<_Kty>, class _A ...

  6. 使用Webdriver执行JS

    首先,我们使用如下方式初始化driver: WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptEx ...

  7. 设置 Quick-Cocos2d-x 在 Windows 下的编译环境

    http://cn.cocos2d-x.org/tutorial/show?id=1304 设置 Quick-Cocos2d-x 在 Windows 下的编译环境 Liao Yulei2014-08- ...

  8. 跨域问题-cors

    什么是跨域如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求.比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略(same-origin policy). 具 ...

  9. hadoop streaming anaconda python 计算平均值

    原始Liunx 的python版本不带numpy ,安装了anaconda 之后,使用hadoop streaming 时无法调用anaconda python  , 后来发现是参数没设置好... 进 ...

  10. 20145316 《Java程序设计》第1周学习总结

    20145316 <Java程序设计>第1周学习总结 教材学习内容总结 一.了解java语言: 1.Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. Java 技术具有卓越的 ...