邊界都是1的最大正方形大小
題目描述
給定乙個n×n
n \times n
n×n的矩陣matrix,在這個矩陣中,只有0和1兩種值,返回邊框全是1的最大正方形的邊長長度、
例如0 1 1 1 1
0 1 0 0 1
0 1 0 0 1
0 1 1 1 1
0 1 0 1 1
其中,邊框全是1的最大正方形的大小為4×4
4 \times 4
4×4,所以返回4
[要求]
時間複雜度為o(n
3)
o(n^3)
o(n3
),空間複雜度為o(n
2)
o(n^2)
o(n2)
輸入描述:
第一行乙個整數n。表示矩陣的長寬。
接下來n行,每行n個整數表示矩陣內的元素
輸出描述:
輸出乙個整數表示答案
示例1輸入
5
0 1 1 1 1
0 1 0 0 1
0 1 0 0 1
0 1 1 1 1
0 1 0 1 1
輸出4
備註:
1 ⩽n
⩽200
1 \leqslant n \leqslant 200
1⩽n⩽200ma
trix
i,j=
0/
1matrix_ = 0/1
matrix
i,j
=0/1
題解:常規解法:列舉長度,分別列舉位置,然後判斷邊界是否滿足,時間複雜度:o(n
4)
o(n^4)
o(n4
),那麼如何優化呢?
仔細思考,列舉長度和列舉位置是省不掉的,我們可以優化判斷邊界是否滿足,不用做四次迴圈挨個判斷。
具體有兩種優化方法,都是用到字首和思想:
優化一(乙個額外陣列):
使用二維陣列儲存字首和。核心思想:假設從左往右列舉,當前長度為 k ,位置為 (i, j) ,那麼求邊界上的 1 的數量變成:sum1 - sum2 ,其中 sum1 是從 (i, j) 開始,長度為 k 的子陣列和,sum2 是比 sum1 小一層的子陣列和,即從 (i+1, j+1) 開始,長度為 k-2 的子陣列和,若sum1 - sum2 == 4*k - 4,則是乙個邊界為 1 的子陣列,在所有合法的情況中找最大值即可。
優化一**:
#include
#include
using
namespace std;
const
int n =
201;
int a[n]
[n];
int n;
intmain
(void)}
int x, y;
for(
int k =
2; k <= n;
++k )
if( k >2)
}}}return0*
printf
("%d\n"
, ret)
;}
優化二(兩個額外陣列):
使用兩個額外陣列,記錄每個位置往上最長多少個連續的1,往左最長多少個連續的1。在判斷邊界是否滿足條件時,直接通過預處理陣列判斷即可。
優化二**:
#include
#include
using
namespace std;
const
int n =
200;
int n, val;
int r[n]
[n];
int c[n]
[n];
intmain
(void)}
int tmp, ret =0;
for(
int i = n -
1; i >=0;
--i )
--tmp;}}
}return0*
printf
("%d\n"
, ret)
;}
法一空間小點,法二時間小點,自己選吧2333。。。 最大正方形
題目鏈結 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 複製 4 4 0 1 1 1 1 1 1 0 0 1 1...
最大正方形
題解 if a i j 1 f i j min min f i j 1 f i 1 j f i 1 j 1 1 f i j 表示以節點i,j為右下角,可構成的最大正方形的邊長。只有a i j 1時,節點i,j才能作為正方形的右下角 對於乙個已經確定的f i j x,它表明包括節點i,j在內向上x個節...
最大正方形
一.題目描述 在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4 二.思路 動態規劃 當前元素matrix i j 對應的最大正方形邊長跟matrix i 1 j m...