• LeetCode "Largest Rectangle in Histogram"


    I got a DP solution first which is O(n^2). Apparently it is not a optimized one - think about: it is linear value space. There must be O(n) solution.

    And yes there is: http://fisherlei.blogspot.com/2012/12/leetcode-largest-rectangle-in-histogram.html

    It reminds me the mono-queue optimization upon DP - it is said to be even out-of-scope of IOI.. Precisely that is not a typical mono-queue style used. The mono-queue maintanence is tricky: if new height is less than top, we pop out all anti-mono elements and calculate corresponding areas - to make sure the queue is monotonous.

    But how to conduct yourself to the wonderland you are longing for? Like this:

    O(n^3) solution is direct -> Has duplicated calculation? Use DP -> O(n^2) -> is it linear space? think about MonoQ -> figure out how to maintanent MonoQ -> O(n)

    Please keep the animated pictures of the whole procedure in mind. That helps.

    I put comments:

    class Solution {
    public:
        int largestRectangleArea(vector<int> &height) {
            int cnt = height.size();
            if(cnt == 0) return 0;
            if(cnt == 1) return height[0];
    
            int max = std::numeric_limits<int>::min();
    
            stack<int> stk; // store indices
            height.push_back(0); // as sentinel for wrapping up everything
            for(int i = 0; i < height.size(); i ++)
            {
                if (stk.empty() || height[i] > height[stk.top()])
                {
                    stk.push(i); // keep growing the non-descending mono-queue
                }
                else
                {
                    int lastInx = stk.top();
                    stk.pop();
                    int lastH = height[lastInx];
                    max = std::max(max, lastH * 
                                (stk.empty() ? i - (-1) - 1 : i - stk.top() - 1)); // expands to the left as much as possible
                    i --; // going back for all heights that are higher than height[i]
                }
            }
    
            return max;
        }
    };

    TO BE REVISED LATER

  • 相关阅读:
    LightOJ 1300 边双联通分量+交错路染色
    HDU 6143 快速幂,组合数
    windows 下fc工具
    HDU 6136 模拟
    HDU 6129 暴力,规律
    UVA Live 7770 模拟
    1096: [ZJOI2007]仓库建设
    1191: [HNOI2006]超级英雄Hero
    3224: Tyvj 1728 普通平衡树
    1208: [HNOI2004]宠物收养所
  • 原文地址:https://www.cnblogs.com/tonix/p/3913807.html
Copyright © 2020-2023  润新知