柱狀圖的最大矩形--單調棧
阿新 • • 發佈:2020-07-31
思路:從左往右遍歷一遍高度值,在[ 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; }