C語言重構【84】柱狀圖中最大的矩形
阿新 • • 發佈:2021-01-13
技術標籤:# 演算法練習C語言版
文章目錄
所有題目原始碼:
題目
給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。
求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210112234646497.png
以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。
圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個單位。
示例:
輸入: [2,1,5,6,2,3]
輸出: 10
方案:
- 雖然可以過,但有大問題
class Solution
{
public:
int largestRectangleArea(vector<int> &heights)
{
//棧的思想
stack<int> s;
//哨兵1、2號
heights.insert(heights.begin(), 0);
heights.push_back(0);
s.push(0);
int len = heights.size();
int area = 0;
int width = 0;
int index;
//第一遍遍歷
//當前比前一個大,前一個暫時無法判斷最大值,入棧
//當前比前一個小,前一個可以判斷最大值,出棧
for (int i = 1; i < len; i++)
{
while (heights[i] < heights[s.top()])
{
//計算面積,彈棧
index = s.top( );
s.pop();
//彈出來的元素的len=前後倆元素的間隔,高度就是本下標的高度
width = i - index;
// 這裡有優化空間,大問題
int j = index - 1;
while (j > 0 && heights[j--] > heights[index])
width++;
area = max(area, heights[index] * width);
}
s.push(i);
}
//最後返回最大值
return area;
}
};
複雜度計算
- 時間複雜度:O(n2)
- 空間複雜度:O(n)