题目:

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. (Hard)

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 heights = [2,1,5,6,2,3],
return 10.

分析:

非常经典的一道题目,想了好久也没想出来,还是参考了讨论区。

题意是找到最大的直方图面积。显而易见的思路是对于每个高度heights[i],向左向右找到第一个小于它的位置,即为以此高度能组成的最大直方图面积。

循环下来求得所有高度为底线的最大直方图面积,求max即可。

但寻找左右边界的时间复杂度O(n),遍历的时间复杂度也是O(n), O(n^2)的算法是超时的。

中间自己还想到了一些简单的优化想法,比如空间换时间,记录求过的边界并利用,但在最坏样例下还是O(n^2)的,还是不行。

题目的解法是采用一个栈,非常的巧妙。

维护一个栈;

当遍历到位置的高度大于栈顶高度时: 压栈,同时说明了,此时这个位置的前一位的下标即为这个高度的左边界;(满足向左数第一个小于他的)

当遍历到位置的高度小于栈顶高度时:一直弹栈至上述条件不满足,同时对每一个弹出的元素,他的右边界即为当前遍历到的位置(右数第一个大于他的)。

此时可以根据左右边界计算以此高度能组成的最大直方图面积。

可以直接在栈中存储下标,便于计算边界差值(左边界是栈内部的下一个元素,因为只要能压栈,说明前一个即为其左边界),同时也方便取出某一下标的高度。

注意:栈为空时,下标取-1;

代码:

 1 class Solution {
 2 public:
 3     int largestRectangleArea(vector<int>& heights) {
 4         int result = 0;
 5         int sz = heights.size();
 6         stack<int> s;
 7         for (int i = 0; i < sz; ++i) {
 8             if (s.empty() || heights[i] >= heights[s.top()]) {
 9                 s.push(i);
10             }
11             else {
12                 while (!s.empty() && heights[s.top()] > heights[i]) {
13                     int cur = s.top();
14                     s.pop();
15                     int prev = (s.empty()) ? -1 : s.top();
16                     result = max(result, (i - prev - 1) * heights[cur] );
17                 }
18                 s.push(i);
19             }
20         }
21         while (!s.empty()) {
22             int cur = s.top();
23             s.pop();
24             int prev = (s.empty()) ? -1 : s.top();
25             result = max(result, (sz - prev - 1) * heights[cur] );
26         }
27         return result;
28     }
29 };

转载于:https://www.cnblogs.com/wangxiaobao/p/5958411.html

LeetCode84 Largest Rectangle in Histogram相关推荐

  1. LeetCode 84. Largest Rectangle in Histogram

    LeetCode 84. Largest Rectangle in Histogram Solution1:我的答案 循环里头套了一个动态规划,缺点是当heights个数或最大高度多高时会很耗时间!! ...

  2. [leetcode]Largest Rectangle in Histogram @ Python

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

  3. [leetcode]84. Largest Rectangle in Histogram c语言

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

  4. 84直方图最大矩形覆盖 · Largest Rectangle in Histogram

    [抄题]: Given n non-negative integers representing the histogram's bar height where the width of each ...

  5. leetcode: Largest Rectangle in Histogram,Maximal Square,Maximal Square问题

    Largest Rectangle问题 题目描述 Given n non-negative integers representing the histogram's bar height where ...

  6. 84. Largest Rectangle in Histogram

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

  7. leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈)

    题目 https://leetcode.com/problems/largest-rectangle-in-histogram/ 题解 一句话总结:遍历数组,对于每个height[i],以其自身的高度 ...

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

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

  9. LeetCode hard 84. Largest Rectangle in Histogram--python,java 15行,c++ 15行 解法

    题目地址: Given n non-negative integers representing the histogram's bar height where the width of each ...

最新文章

  1. Spline interpolation and Savitzki-Golay smoothing
  2. 新手学python用什么软件-初学 Python 需要安装哪些软件?
  3. python3.8.5怎么用-Python 3.8 新功能大揭秘【新手必学】
  4. 画一个皮卡丘项目小结(4)
  5. Linux 设置core dump
  6. 论文笔记(Social Attentional Memory Network:Modeling Aspect- and Friend-level Differences in Recom-)
  7. 嵌入式系统常见的内存段
  8. Unity中Android API 28之后无法HTTP请求
  9. Spring Controller – Spring MVC控制器
  10. opencv图像分析与处理(15)- 图像压缩中的编码方法:霍夫曼编码、Golomb编码、Rice编码、算术编码及其实现
  11. mysql日期序列填充_mysql – 如何使用一系列日期填充表格?
  12. Tortoise SVN 汉化(官网下载汉化包)
  13. Kali Linux 2022下载
  14. 如何查看征信报告上的不良信息?
  15. 求(2Y-4)²-4(Y-2)(3Y+7)≥0得解
  16. 【Vue项目复习笔记】详情页的展示
  17. EI 收录的期刊有哪些
  18. NLP入门概览(9) ——句法分析c:局部句法分析、依存关系分析
  19. vue开发APP使用微信分享和QQ分享功能
  20. 2.4G模块及SPI通讯

热门文章

  1. 展开收起js动画效果
  2. 决策单调性Ⅱ:斜率优化(1597: [Usaco2008 Mar]土地购买)
  3. opencv 学习第二课 摄像头、外部视频读取、处理、显示、写入 代码注释版 保证你每一行都能读懂
  4. matlab2c使用c++实现matlab函数系列教程-cumprod函数
  5. AttributeError: module 'socketio' has no attribute 'Server'
  6. 配置Sublime Text3和MASM32编译汇编的问题汇总
  7. quartus仿真18:仿真简单D触发器和JK触发器输出的波形
  8. (Electronic WorkBench)EWB仿真JK触发器
  9. spring mvc-基础-简单程序
  10. Dubbo面试18问!这些你都会吗?