1. 程式人生 > 實用技巧 >柱狀圖的最大矩形--單調棧

柱狀圖的最大矩形--單調棧

思路:從左往右遍歷一遍高度值,在[ 0 , i ]範圍內,求以height[ i ]為高度值能取的最大面積,不斷更新這個最大面積即為最終結果

以某個柱子作為高度的最大面積如何求?------------------>單調遞增棧

舉個例子:給定柱子的高度分別為2 1 5 6 2 3

下標在[0,2]的範圍內,以5為高的最大面積為5*1 此時維持的單調棧為( 1 ) 1是比5小的第一個元素所在的下標 Area=5*(2-1)

更新完最大面積之後,元素5所在的下標2入棧,此時單調棧的元素為(1,2)

//單調棧(遞增)求柱狀圖最大面積
int largestRectangleArea(vector<int
>& heights) { //每個柱子的高度 heights.push_back(0); //單調遞增的一個棧,棧儲存得是當前柱子高度所在得下標 stack<int> stk; int maxArea = 0; for (int i = 0; i < heights.size(); i++) { //while迴圈維持單調棧的遞增性質, while (!stk.empty() && heights[i] < heights[stk.top()]) {
int top = stk.top(); stk.pop(); //不斷更新當前高度能取得最大值,面積=當前高度*(當前位置-第一個比當前高度小的柱子座標) maxArea = max(maxArea, heights[top] * (stk.empty() ? i : (i - stk.top() - 1))); } stk.push(i); } return maxArea; }