Largest Rectangle in Histogram

Largest Rectangle in Histogram 題解


題目描述

Largest Rectangle in Histogram
即尋找序列S中最大的連續子序列矩形面積。連續子序列s矩形面積定義:min{s[i]|0<i<=len(s)} * len(s)
如:S=[2,1,5,6,2,3],最大的連續子序列矩形面積10,此連續子序列s=[5,6]優化

題解

遍歷全部連續子序列並計算其矩形面積,然後取最大值便可。時間複雜度爲O(n^2),空間複雜度爲O(1)。但存在重複計算,可對此部分進行優化。轉化成另外一種形式的遍歷:對每一個可能的min{s[i]|0<i<=len(s)}進行遍歷。然後取此時知足條件的最大len(s)便可。前者即序列的每一個取值S[i](0<i<=len(S)),最大len(s)=Right - Left - 1Right知足(S[Right] < S[i] && Right > i)Left知足(S[Left] < S[i] && Left < i)。設置標兵:S[0] = S[len(S) + 1] = min{S[i]|0<i<=len(S)} - 1。利用棧保存狀態,時間複雜度爲O(n),空間複雜度爲O(n)ui

代碼

typedef unsigned int uint;
static const uint MAX_SIZE = 0x8000;
static uint keep[MAX_SIZE];
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        size_t len = heights.size(), keepEnd = 0, rect = 0;
        for (keep[0] = len; len--; keep[++keepEnd] = len) {
            uint tmp = heights[len], pos = keep[keepEnd];
            while (keepEnd) {
                uint area = heights[pos];
                if (tmp >= area)
                    break;
                pos = keep[--keepEnd];
                if ((area *= (pos - len - 1U)) > rect)
                    rect = area;
            }
        }

        while (keepEnd) {
            uint area = heights[keep[keepEnd]];
            if ((area *= keep[--keepEnd]) > rect)
                rect = area;
        }

        return rect;
    }
};

總結

主要應用了等價轉化的思想。spa

相關文章
相關標籤/搜索