zoukankan      html  css  js  c++  java
  • 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测试程序源码

  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214712.html
Copyright © 2011-2022 走看看