柱狀圖中找最大矩形 & 矩陣中找最大的僅含相同值的矩形區域


一、具體題目如下:給一組非負的整數來表示一個柱狀圖,設計一個算法獲得柱狀圖中最大矩形的面積。比如,輸入如下數據:2,1,5,6,2,3 ,其中每個數表示一個柱狀條的高度,柱狀條的寬度爲默認值1,則計算得最大矩形的面積爲10。

 ==>

此問題,在Leetcode中有原題:Largest Rectangle in Histogram

算法時間複雜度o(n):

int largestRectArea(vector<int> &height) {
    stack<int> p;
    int i = 0, res = 0;
    height.push_back(0);//作用:清空棧
    while(i < height.size()) {
        if(p.empty() || height[p.top()] <= height[i])
            p.push(i++);
        else {
            int t = p.top();
            p.pop();
            res = max(res, height[t] * (p.empty() ? i : i - p.top() - 1 ));
        }
    }
    return res;
}


二、在一個位圖中找面積最大的白色矩形:給你一個NxN的黑白位圖,找一個面積最大的全白色的矩形。注意了,是一個矩形,不是任意一個白色相連的區域。


如果用最大子陣和求解,複雜度就是o(n^3),實際上可以用上面算法求解:

陳利人:這個題實際上是上題“從柱狀圖中找最大矩形”的變種。基本思路:以行爲單位,掃描這行之上的每列有多少白色的點,並記錄下來成類似於柱狀圖的數組,考慮前面的部分結果,這個可以做到O(n);然後對這個數組用上題的解法O(n)得到當前最大的矩形。所以整個算法的複雜度是O(n*n)。童學們,學以致用很重要。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章