給定乙個整形矩陣map,其中的值只有0和1,求其中全是1的所有矩形區域中,最大的矩形區域中1的數量,例如:1 1 1 0,其中最大的矩形區域有3個1,返回3.
再如:1 0 1 1
1 1 1 1
1 1 1 0
其中,最大的矩形區域有6個1,返回6
如果矩陣大小為o(n*m),可以做到時間複雜度為o(n*m).
矩陣切割:矩陣行數為n,對每行進行切割,以當前行為底,統計每列的1的數量,使用陣列height來儲存,比如題目中的3*4的矩陣的舉例,以第一行做切割,height=,以第二行做切割,height=,以第三行做切割,height=
求解最大矩陣:對每行的height分別去求最大矩陣,最後選出乙個最大值即可。
1>遍歷height陣列
2>棧為空或者當前height[i]大於棧頂元素直接入棧
3>若棧不為空,並且當前height[i]小於棧頂元素 j(假設為j,因為棧裡存放的是陣列索引值,這裡比較的是height[i]<=height[j]),則需要彈出棧頂元素,則對於彈出的元素j來說左邊位置離j最近並且小於arr[j]的值為當前棧頂(記為k)對應的值,右邊位置則是i;
4>同理來說,對於當前彈出棧頂j,如果height[j]>height[i],則j所在的柱子向右擴充套件最多到i-1,因為height[i]已經比height[j]小了;如果height[j]==height[i],則j所在的柱子向右擴充套件至少到i-1,因為height[i]只是等於height[j];
5>對於j所在的柱子,向左最遠可以擴充套件到k+1(k為當前棧頂元素,因為height[k]已經比height[j]小了)
6>綜上,j位置能的最大矩形為: [(i-1)-(k+1)+1]*height[j]=(i-k-1)*height[j]
7> 遍歷完陣列後,若棧不為空,則對於棧中的所有元素,它們的右邊位置最近並且小於他們的值都不存在,我們賦予i為height.length;j位置能的最大矩形公式變為為: [(height.length-1)-(k+1)+1]*height[j]=(height.length-k-1)*height[j]
疑惑解答:對於步驟4>,若height[j]==height[i],則向右至少為i-1,那麼求出來的矩形面積不是偏小嘛?其實確實存在,但是不用擔心因為我們此刻針對的是j來求解,當i進棧後,再次彈棧時,就會求解出正確的,因為i柱子和j柱子擴充套件出來的最大矩形是同乙個。
public int maxrecsize(int map)
int maxarea=0;
int height=new int[map[0].length];
for(int i=0;istack=new stack();
for(int i=0;istack.push(i);
} while(!stack.isempty())
return maxarea;
}
棧和佇列 求最大子矩陣的大小
題目 給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大的矩形區域為1的數量。例如 1 0 1 1 1 1 1 1 1 1 1 0 其中,最大的矩形區域有6個1,所以返回6.題目 如果矩陣的大小是o n m 本題可以做到時間複雜度為o n m 1 矩陣的行數是n,以每...
求最大子矩陣的大小
給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...
求最大子矩陣的大小
題目 給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩陣區域中,最大的矩形區域為1的數量。思路 步驟1 矩陣的行數為n,以每一行做切割,統計以當前行作為底的情況下,每個位置往上的1的數量。使用高度陣列height來表示。例如 map 1 0 1 1 1 1 1 1 1 1 1 0...