zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    面试常问题
    雷达无线电系列(五)拟合优度检验(matlab)
    LDAP轻量级目录访问协议总结(待完成)
    zipkin数据追踪(待完成)
    git多定制版本管理
    git单修改推送多分支(cherry-pick)
    git工作流及插件使用说明
    基金-股票-期权知识总结(待完成)
    java AESRSA加密解密样例
    分享一个统计文档中不同key的个数的python脚本
  • 原文地址:https://www.cnblogs.com/chasuner/p/rectanglearea.html
Copyright © 2011-2022 走看看