邊界都是1的最大正方形大小

2021-10-10 13:30:30 字數 2240 閱讀 7118

邊界都是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...