【題目描述】
Givennnon-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].
The largest rectangle is shown in the shaded area, which has area =10unit.
給定n個非負整數表示直方圖的條形高度,每個條的寬度爲1,找到直方圖中最大矩形的面積。
以上是一個直方圖,每個欄的寬度爲1,高度= [ 2,1,5,6,2,3 ]。
最大矩形顯示在陰影區域,面積爲10單位。
【題目鏈接】
www.lintcode.com/en/problem/largest-rectangle-in-histogram/
【題目解析】
這道題目算是比較難得一道題目了,首先最簡單的做法就是對於任意一個bar,向左向右遍歷,直到高度小於該bar,這時候計算該區域的矩形區域面積。對於每一個bar,我們都做如上處理,最後就可以得到最大值了。當然這種做法是O(n2),鐵定過不了大數據集合測試的。
從上面我們直到,對於任意一個bar n,我們得到的包含該bar n的矩形區域裏面bar n是最小的。我們使用ln和rn來表示bar n向左以及向右第一個小於bar n的bar的索引位置。
譬如題目中的bar 2的高度爲5,它的ln爲1,rn爲4。包含bar 2的矩形區域面積爲(4 - 1 - 1) * 5 = 10。
我們可以從左到右遍歷所有bar,並將其push到一個stack中,如果當前bar的高度小於棧頂bar,我們pop出棧頂的bar,同時以該bar計算矩形面積。那麼我們如何知道該bar的ln和rn呢?rn鐵定就是當前遍歷到的bar的索引,而ln則是當前的棧頂bar的索引,因爲此時棧頂bar的高度一定小於pop出來的bar的高度。
爲了更好的處理最後一個bar的情況,我們在實際中會插入一個高度爲0的bar,這樣就能pop出最後一個bar並計算了。
【參考答案】
www.jiuzhang.com/solutions/largest-rectangle-in-histogram/
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。