LeetCode 84. 柱狀圖中最大的矩形(Largest Rectangle in Histogram)

題目描述

 

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

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

 

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

 

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

 

示例:blog

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

 

解題思路

 

這道題跟LeetCode 11很類似,可是由於考慮柱子寬度,所以解題技巧不相同,此題考查單調棧的應用。咱們首先在數組最後加入0,這是爲了方便處理完數組中的全部高度數據。假設存儲高度座標的棧爲stack,當前處理的高度座標爲i(i∈[0→n]):get

  1. 若是當前stack爲空,或者heights[i]大於等於棧頂座標對應高度,則將i加入stack中,並將i加一;
  2. 若是heights[i]小於棧頂座標對應高度,說明能夠開始處理棧內的座標造成的局部遞增高度,以求得當前最大矩形面積。彈出當前棧頂座標 = top,此時棧頂新座標 = top',那麼對應計算面積的寬度w = i - 1 - top'(若彈出棧頂座標後,stack爲空,則對應w = i),獲得面積s = heights[top] * w,再次返回2檢查棧;
  3. 遍歷完成i∈[0→n],返回最大矩形面積。

 

代碼

 

 1 class Solution {  2 public:  3     int largestRectangleArea(vector<int>& heights) {  4         stack<int> s;  5         int i = 0, maxArea = 0;  6         heights.push_back(0);  7         while(i < heights.size()){  8             if(s.empty() || heights[s.top()] <= heights[i]){  9  s.push(i); 10                 i++; 11  } 12             else{ 13                 int top = s.top(); 14  s.pop(); 15                 int l = s.empty() ? i : i - s.top() - 1; 16                 maxArea = max(maxArea, heights[top] * l); 17  } 18  } 19         return maxArea; 20  } 21 };

 

參考自io

LeetCode 84. Largest Rectangle in Histogram(直方圖中最大矩形面積)class

相關文章
相關標籤/搜索