84:Largest Rectangle in Histogram【陣列】【棧】
阿新 • • 發佈:2019-01-10
/*題意:N個非負整數,分別代表寬為1的柱子,從圖中找出最大矩形的面積*/ /** *思路: 觀察發現,只有較矮的柱子才能和其它柱子構成矩形。比較相鄰的兩個 * 柱子: * 1)如果後面的柱子比前面的矮,如1比2矮,那麼2在以後的計算中已經 * 沒什麼用,這時候計算2和之前的柱子組成的最大矩形。 * 2)如果後面的柱子比前面的高,如1和5,這兩根柱子可以和後面的柱子組成矩形 * * 用一個棧記錄上升的柱子(柱子的位置可能是不連續的),如果遇到下降的柱子, * 開始計算棧頂和之前柱子構成的矩形面積。棧儲存的是柱子的下標,而不是柱子 * 的高度。目的是方便計算矩形的寬度。遇到上升的柱子,壓入棧中 */ class Solution { public: int largestRectangleArea(vector<int>& height) { int len = height.size(), maxx = 0; stack<int> s; s.push(-1);//方便計算相對距離 for(int i = 0; i < len; i ++) { int pre = s.top(); if(pre < 0 || height[i] >= height[pre])//上升的柱子,壓入棧中 s.push(i); else { s.pop(); maxx = max(maxx, height[pre]*(i-s.top()-1)); i--;//不確定當前元素是否在上升序列中 } } //棧中還有元素,表明柱子到結尾都是上升的 while(s.top() != -1) { int pre = s.top(); s.pop(); maxx = max(maxx, height[pre]*(len-s.top()-1)); } return maxx; } };