《84. 柱狀圖中最大的矩形》
阿新 • • 發佈:2020-08-28
觀察後可以發現,對於每個塊成產生的以他為高的最大面積的寬度,就是左邊第一個比他小的位置到它右邊第一個比他小的位置。
那麼,我們可以用一個單調遞增棧,在退棧時維護即可,顯然退棧時棧頂和當前元素就是他左邊第一個比他小的和右邊第一個比他小的。
然後為了不在特殊處理結束後沒退棧的元素,我們在頭尾插入兩個0元素,這樣就能保證所有元素都必定能找到左邊和右邊比他小的元素。
class Solution { public: int largestRectangleArea(vector<int>& heights) { heights.push_back(0); heights.insert(heights.begin(),View Code0); int N = 1e5+5,len = heights.size(); long long ans = 0; int S[N],top = 0;//單調遞增棧 for(int i = 0;i < len;++i) { while(top != 0 && heights[i] < heights[S[top]]) { int dis = i-S[top-1]-1; long long ma = (longlong)dis*heights[S[top]]; if(ma > ans) ans = ma; top--; } S[++top] = i; } return ans; } };