LeetCode 84. Largest Rectangle in Histogram

O(N)時間+O(N)空間複雜度。代碼以下:數組

int largestRectangleArea(vector<int>& heights) {
    if (heights.empty()) {
        return 0;
    }

    vector<int> bars;
    bars.push_back(0);
    int maxArea = 0;
    // 在原數組最後增長一個高度爲0的bar,這樣能夠保證最終全部在stack裏的bar都被彈出,而不需在循環結束時再單獨處理一遍stack裏的bar
    heights.push_back(0);
    for (int i = 1; i < heights.size(); i++) {
        int currentHeight = heights[i];
        while (!bars.empty() && currentHeight <= heights[bars.back()]) {
            int k = bars.back();
            int h = heights[k];
            bars.pop_back();
            // 處理剛彈出的bar k,假設前一個元素的index爲j,則bar的寬度w爲: 左邊寬度(k - j) + 右邊寬度(i - k -1) = i - j - 1.
            // 解釋:
            // 左邊從 k 到 j 是被bar k彈出的元素,顯然它們都比k高,加上k自己,寬度即爲k - j。
            // 右邊是被新元素 i 彈出的元素,顯然他們也比 k 高,不然以前 k 就被它們彈出了。
            int w = bars.empty() ? i : (i - bars.back() - 1);
            int area = h * w;
            maxArea = max(maxArea,area);
        }
        bars.push_back(i);
    }
    return maxArea;
}
相關文章
相關標籤/搜索