類似於蓄水池問題,首先創造乙個矩形,記錄每一列上true的數量。
[
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 1]
]
可轉換為:
[
[1, 1, 0, 0, 1],
[0, 2, 0, 0, 2],
[0, 0, 1, 1, 3],
[0, 0, 2, 2, 4],
[0, 0, 0, 0, 5]
]
第一種方案:a[i][j]=min(a[i][j-1],matrix[i][k])×矩陣長度。 但是如果為遞增的階梯形時,會多算很多1. 因為a[i][j-1]不能代表以a[i][j-1]為右下腳的矩陣對高度。
第二種:記錄每一行最小值和連續不為0的長度,然後和matrix[i][j]比較求最大面積。同樣不可行,遞增階梯形時會出問題。
第三種方案:看來只能用largest rectangle in histogram的方法,使用stack。維護乙個stack,stack儲存index,元素的高度遞增。為什麼是遞增的?可以準確確定最小高度,及適用長度(從當前index到end)。遞減也可以。但必須保證單調性。每次遇到遞減時,為什麼可以pop?因為遇到遞減時,則代表遇到峰值,遇到峰值時,我們可以確定其包含的最大矩陣的右邊界。其左邊界也可以根據stack.peek確定。
如圖為當前指標走到index=4時,出現遞減情況,則第一張圖是stack出棧,然後根據stack中前乙個值以及index位置確定左右邊界,根據stack中當前值確定高度。
第一張圖:stack: 0,1,2. index=3 面積等於(3-1-1) * 5=5 如圖綠色部分
第二張圖:stack:0,1 index=3 面積為(3-0-1)*3=6 如圖綠色部分
public class solution
}int res = 0;
for(int i = 0; i < height; i++)
return res;
}private int getsquare(int i, int matrix) else
top = stack.peek();
}stack.push(j);}}
while(!stack.isempty())
return res;}}
Lintcode矩形面積
實現乙個矩陣類rectangle,包含如下的一些成員變數與函式 兩個共有的成員變數width和height分別代表寬度和高度。乙個建構函式,接受2個引數 width 和 height 來設定矩陣的寬度和高度。乙個成員函式getarea,返回這個矩陣的面積。您在真實的面試中是否遇到過這個題?yes 樣...
最大子矩形
80 引數約定 0糖果盒 candy box 問題描述 乙個被分為 n m 個格仔的糖果盒,第 i 行第 j 列位置的格仔裡面有 a i j 顆糖。本來 tenshi 打算送這盒糖果給某 ppmm 的,但是就在要送出糖果盒的前一天晚上,乙隻極其可惡的老鼠夜襲糖果盒,有部分格仔被洗劫並且穿了洞。ten...
最大的矩形
最大的矩形問題 poj2559 題解 單調棧做 給定從左到右多個矩形,已知這此矩形的寬度都為1,長度不完全相等。這些矩形相連排成一排,求在這些矩形包括的範圍內能得到的面積最大的矩形,列印出該面積。所求矩形可以橫跨多個矩形,但不能超出原有矩形所確定的範圍。建立乙個單調遞增棧,所有元素各進棧和出棧一次即...