• LeetCode-Largest Rectangle in Histogram


    看起来很简单,实际上超级难的题目呀,

    开始怎么想都只能想到O(n^2)的方法,

    后来看了一下提示这道题是用栈,

    思考了一下写了一个,基本思路算是理解了,

    不过关键在于遇到一个小于栈顶的数时,在不断弹出栈中

    比该元素大的数的时候要记住弹出元素的个数,所以我写的是用两个

    值来表示栈中的一个元素,一个是高度,另一个是个数,

    可是这样还有一个问题:每次更新的时候只更新了左边比它大的元素的个数,

    当后面再有元素弹出时,这时它右边的这些弹出了的元素的长度就没有被计算,

    所以关键问题在于怎么记录一个元素左右比它大的元素的数目,即它的最大长度,

    哎,始终想不到比较高效的方式,如果直接给每个元素一个值来记录的话,这样每次

    都需要遍历前面的所有元素来更新他们的值,这样复杂度实际上还是n^2.

    无奈,只好看大神的解法,看完之后真是豁然开朗,醍醐灌顶,

    多简洁高效的做法呀,直接再压入弹出元素数目的新元素就行了,

    压入一个元素就等于前面所有元素的长度都加1了嘛,非常高效。

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         if (height.empty()) {
     7             return 0;
     8         }
     9         stack<int> rect;
    10         height.push_back(0);
    11         int maxarea = 0;
    12         for (int i = 0; i < height.size(); ++i) {
    13             int count = 0;
    14             while (!rect.empty() && rect.top() > height[i]) {
    15                 ++count;
    16                 maxarea = max(maxarea, count * rect.top());
    17                 rect.pop();
    18             }
    19             while (count--) {
    20                 rect.push(height[i]);
    21             }
    22             rect.push(height[i]);
    23         }
    24         return maxarea;
    25     }
    26 };
  • 相关阅读:
    洛谷P1169 [ZJOI2007]棋盘制作
    洛谷P4147 玉蟾宫
    洛谷P3068 [USACO13JAN]Party Invitations S
    洛谷P3594 [POI2015]WIL-Wilcze doły
    洛谷P2564 [SCOI2009]生日礼物
    洛谷P4296 [AHOI2007]密码箱
    洛谷P2421 [NOI2002]荒岛野人
    洛谷P3990 [SHOI2013]超级跳马
    MySQL 默认引擎 默认编码
    Python 换源
  • 原文地址:https://www.cnblogs.com/chasuner/p/rectanglearea.html
Copyright © 2020-2023  润新知