單調棧結構問題 求最大子矩陣

2021-09-24 13:49:41 字數 1359 閱讀 1223

題目描述

given a 2d binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

for example, given the following matrix:

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1

1 0 0 1 0

return 6.

1.接替思路

分割每一行,統計以當前行作為底的情況下的每個位置向上1的數量

如:分割第一行結果為 [1,0,1,0,0]

第二行為[2,0,2,1,1]第三行為[3,1,3,2,2]最後一行為[4,1,0,3,0]

**實現如下

public int maxfrombottom(int arr)

}return bottom;

}

2.此時該問題就是求每個陣列組成的矩形的最大面積,這個問題可以採用暴力解法,每遍歷到乙個柱高後向前找能形成的最大面積,時間複雜度為o(n^2)**實現如下

public int largestrectanglearea(int arr)  

//當發現arr[i] > arr[i+1] 結束擴充套件,開始尋找最大面積

//每個在i之前的柱高*該柱到i的距離 為該柱形成的面積

int high = arr[i];

for(int j = i; j >= 0; j--)

}return res;

}

用時間複雜度為o(n)的演算法,用到單調棧結構。相比於暴力法單調棧直接記錄了尋找最大面積中的遍歷過程。對每個元素push一次,pop一次,在pop的過程中拿到該階段最大值。如[2,3,4,3,5] 先壓如index 0值為2,index=1時,arr[1] > arr[0]繼續壓入此時棧為【1,0】,繼續壓入4的index為【2,1,0】,當碰到index為3時,arr[3] < arr[2] 此時2彈出,arr[2]=4柱高為4,向右擴充套件時為3,無法擴充套件,向左擴充套件為3無法擴充套件,則index=2擴充套件出的面積為4左右兩邊擴充套件的邊界*高度,此時相當於暴力法中i = 2,j=2所算出的第乙個面積,再彈出1,arr[1]=3重複上述過程。**實現如下:

public int maxsize(int arr)

stack.push(i);

}//最後形成乙個單調棧則棧中的值需要pop出計算面積。

while(!stack.isempty())

return maxsize;

}

poj1964最大子矩陣 (單調棧加列舉)

題目傳送門 題目大意 乙個矩陣中,求f組成的矩陣的面積,答案乘以三 思路 n如果是小於100的,就可以通過字首和,然後三重迴圈暴力找,和poj1050很像,但由於是1000,就不可以了,時間複雜度太高。這道題的類別是單調棧,仔細想一下,發現其實就是先統計每一行網上有多少個長方形,然後再列舉每一行,算...

COCI NEO 單調棧求最大全1子矩陣

應該能進 現在有乙個n m的矩陣,定義乙個矩陣 r 2,c 2 是cool的當 a i j a i 1 j 1 a i j 1 a i 1 j 定義乙個矩陣是非常cool的,當所有它的子矩陣 r 2,c 2 是cool的。問你這個矩陣中非常cool 的矩陣最多包含的點的數量是多少。這個題意我搞了好久...

棧和佇列 求最大子矩陣的大小

題目 給定乙個整型矩陣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,以每...