一、具體題目如下:給一組非負的整數來表示一個柱狀圖,設計一個算法獲得柱狀圖中最大矩形的面積。比如,輸入如下數據: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)。童學們,學以致用很重要。