1. 程式人生 > 實用技巧 >006. 柱狀圖最大的矩形

006. 柱狀圖最大的矩形

---------------------

  - 涉及內容:
  - 單調棧

  - 2020/10/25

題目如下:


給定 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


著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。


補充知識點:


- 單調棧
      單調遞增棧就是從棧底到棧頂是從大到小
      單調遞減棧就是從棧底到棧頂是從小到大


實現:


- 解法①:單調棧,以上面的圖來分析過程,從最左邊柱子開始,先入棧,遇到的柱子比它矮,則說明找到了右邊界,
        此時需要做的時候,出棧,並且計算這個柱子的面積了,接著矮柱子入棧。接下來的兩個柱子都比它高,入棧。
        當下一根柱子A要入棧的時候,比上一根柱子矮,則說明找到了上一根柱子的右邊界,此時將其出棧並且可以計
        算該柱子的面積,然後柱子A繼續和之前的柱子比較,發現上上根柱子也比它高,又找到了一個邊界,將上上根
        柱子出棧,並計算它到要入棧之間的面積。依次類推
         
-------------------------------------------------------------------------------------------------------------

-      部分說明:
-      能力有限,直接代入演算更加容易理解

-      時間複雜度:O(N)
-      空間複雜度:O(N)

-----------------------------------------------------------------------------------
C++

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int maxArea = 0;
        stack<int> newStack;
        heights.push_back(0);

        for (int i = 0; i < heights.size(); ++i) {
            // 如果棧不空並且如果要入棧的元素比棧內元素要小的話,則將棧內元素出棧,並計算面積
            while (!newStack.empty() && heights[newStack.top()] >= heights[i]) {
                int cur = newStack.top(); 
                newStack.pop();      //  出棧

                maxArea = max(maxArea, heights[cur] * (newStack.empty() ? i : (i - newStack.top() - 1)));
            }
            newStack.push(i);      // 入棧的是陣列下標索引
        }
        return maxArea;
    }
};