• LeetCode(84) 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.

    1
    Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

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

    分析

    如木桶理论,题目给定一组矩形柱高度序列,求出其构成的直方图最大面积;

    方法一:
    依次遍历每个坐标位置,从该柱形左右延展,当高度降低时停止延展,求出其组成的矩形面积,实时更新最大面积;

    但是大数据集会超时;

    方法二:
    查看资料看到一个经典的栈解决方法参考网址~~

    给出详细解析:

    1、如果已知height数组是升序的,应该怎么做?

    比如1,2,5,7,8

    那么就是(1*5) vs. (2*4) vs. (5*3) vs. (7*2) vs. (8*1)

    也就是max(height[i]*(size-i))

    2、使用栈的目的就是构造这样的升序序列,按照以上方法求解。

    但是height本身不一定是升序的,应该怎样构建栈?

    比如2,1,5,6,2,3

    (1)2进栈。s={2}, result = 0

    (2)1比2小,不满足升序条件,因此将2弹出,并记录当前结果为2*1=2。

    将2替换为1重新进栈。s={1,1}, result = 2

    (3)5比1大,满足升序条件,进栈。s={1,1,5},result = 2

    (4)6比5大,满足升序条件,进栈。s={1,1,5,6},result = 2

    (5)2比6小,不满足升序条件,因此将6弹出,并记录当前结果为6*1=6。s={1,1,5},result = 6

    2比5小,不满足升序条件,因此将5弹出,并记录当前结果为5*2=10(因为已经弹出的5,6是升序的)。s={1,1},result = 10

    2比1大,将弹出的5,6替换为2重新进栈。s={1,1,2,2,2},result = 10

    (6)3比2大,满足升序条件,进栈。s={1,1,2,2,2,3},result = 10

    栈构建完成,满足升序条件,因此按照升序处理办法得到上述的max(height[i]*(size-i))=max{3*1, 2*2, 2*3, 2*4, 1*5, 1*6}=8<10

    综上所述,result=10

    AC代码

     1 class Solution {
     2 public:
     3     /*方法一:每个坐标点左右延伸(当高度降低停止延伸)构造矩形,但是大集合TLE*/
     4     int largestRectangleArea1(vector<int> &height) {
     5         if (height.empty())
     6             return 0;
     7         int maxArea = 0;
     8         int len = height.size();
     9         for (int i = 0; i < len; ++i)
    10         {
    11             /*记录包含第i个柱体的矩形面积*/
    12             int tmpArea = height[i];
    13             int left = i - 1, right = i + 1;
    14             /*左侧扩展*/
    15             while (left >= 0 && height[left] >= height[i])
    16             {
    17                 tmpArea += height[i];
    18                 --left;
    19             }//while
    20             /*右侧扩展*/
    21             while (right < len && height[right] >= height[i])
    22             {
    23                 tmpArea += height[i];
    24                 ++right;
    25             }//while
    26 
    27             if (maxArea < tmpArea)
    28                 maxArea = tmpArea;
    29         }//for
    30 
    31         return maxArea;
    32     }
    33     /*方法二:利用栈*/
    34     int largestRectangleArea(vector<int> &height) {
    35         if (height.empty())
    36             return 0;
    37         stack<int> stk;
    38         int len = height.size();
    39         int maxArea = 0;
    40         for (int i = 0; i < len; i++)
    41         {
    42             if (stk.empty() || stk.top() <= height[i])
    43                 stk.push(height[i]);
    44             else
    45             {
    46                 int count = 0;
    47                 while (!stk.empty() && stk.top() > height[i])
    48                 {
    49                     count++;
    50                     maxArea = max(maxArea, stk.top()*count);
    51                     stk.pop();
    52                 }
    53                 while (count--)
    54                     stk.push(height[i]);
    55                 stk.push(height[i]);
    56             }//else
    57         }//for
    58         int count = 1;
    59         while (!stk.empty())
    60         {
    61             maxArea = max(maxArea, stk.top()*count);
    62             stk.pop();
    63             count++;
    64         }//while
    65         return maxArea;
    66     }
    67 };

    GitHub测试程序源码

  • 相关阅读:
    windows下一些启动服务的命令
    使用命令行启动服务
    无法向会话状态服务器发出会话状态请求转
    SQLServer跨服务器连接的多种方法
    Response.Buffer = True
    UpdatePanel和Jquery冲突
    <iframe>标签自适应高度和宽度
    java判断获取到的中文字符串是否乱码
    MMC不能打开文件C:\WINDOWS\SYSTEM32\inetsrv\iis.msc,如何解决?
    在.NET中用excel导出(概要)
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214712.html
Copyright © 2020-2023  润新知