1. 程式人生 > 其它 >【力扣-困難】84. 柱狀圖中最大的矩形

【力扣-困難】84. 柱狀圖中最大的矩形

技術標籤:leecodeleetcode演算法

給定n個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。
求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為[2,1,5,6,2,3]

圖中陰影部分為所能勾勒出的最大矩形面積,其面積為10個單位。

示例:

輸入: [2,1,5,6,2,3]
輸出: 10

https://leetcode-cn.com/problems/largest-rectangle-in-histogram/

【單調棧】

遍歷柱狀圖,以當前柱子為基點,分別向左右找到小於自己高度的位置,左右這個跨度為寬,得到面積;

左右跨度用左邊界、右邊界兩個陣列記錄,藉助單調棧,一次向右遍歷柱狀圖,如果當前高度heights[i]<棧頂,迭代地將>=heights[i]的元素出棧,直到加入heights[i]後,棧會保持一個遞增的單調關係

int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n), right(n, n);
        stack<int> monoStack;
        for(int i = 0 ; i < n; i++){
            while(!monoStack.empty() && heights[monoStack.top()] >= heights[i]){
                right[monoStack.top()] = i;
                monoStack.pop();
            }
            left[i] = monoStack.empty() ? -1 : monoStack.top();
            monoStack.push(i);
        }
        int ans = 0;
        for(int i = 0; i < n; i++){
            ans = max(ans, heights[i] * (right[i] - left[i] - 1));
        }
        return ans;
    }