1. 程式人生 > >84:Largest Rectangle in Histogram【陣列】【棧】

84:Largest Rectangle in Histogram【陣列】【棧】

/*題意: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;
    }
};