LeetCode_84.柱狀圖中最大的矩形

麻辣小雞絲 發表於 2020-09-23

題目:

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

在這裡插入圖片描述

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

在這裡插入圖片描述

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

示例:

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:窮舉法:

所謂“窮舉法”(暴力法),就是列舉一個問題的所有場景,從中選出最大、最小值。例如此題求最大矩形面積,因為矩形面積=高*底,所以窮舉法就要固定其中之一,遍歷另一個變數的值。固定底不太容易實現,所以採用固定高度,然後找到最大底邊的方法。

時間複雜度: O(n^2)
空間複雜度: O(1)

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int maxArea = 0;
        for(int i = 0; i < heights.size(); ++i) { //列舉高度,左右擴散確定底邊
            int left = i, right = i;
            while(left >= 0 && heights[left] >= heights[i]) --left;
            while(right < heights.size() && heights[right] >= heights[i]) ++right;
            maxArea = max(maxArea, heights[i] * (right - left - 1));
        }
        return maxArea;
    }
};

方法二:單調遞增棧:

方法三:單調遞增棧 + 哨兵: