006. 柱狀圖最大的矩形
阿新 • • 發佈:2020-10-25
---------------------
- 涉及內容:
- 單調棧
- 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; } };