7月24日 最大正方形

2021-10-08 11:21:54 字數 1602 閱讀 8313

題目如下:

如圖題目所示是求乙個矩陣中最大正方形面積的最大值。這讓我想到了前些天剛做的求一片區域中所有海島數量的題目,那道題是將問題轉換成圖搜尋問題,用dfs(深度優先遍曆法)來遍歷圖從而尋找出圖中所有的海島數量。所以我一開始也是嘗試將這個問題轉換成圖搜尋問題,可是找不到解決方法,然後就想到暴力法。

由於正方形的面積等於邊長的平方,因此要找到最大正方形的面積,首先需要找到最大正方形的邊長,然後計算最大邊長的平方即可。

暴力法是最簡單直觀的做法,具體做法如下:

遍歷矩陣中的每個元素,每次遇到 1,則將該元素作為正方形的左上角;

確定正方形的左上角後,根據左上角所在的行和列計算可能的最大正方形的邊長(正方形的範圍不能超出矩陣的行數和列數),在該邊長範圍內尋找只包含 1 的最大正方形;

每次在下方新增一行以及在右方新增一列,判斷新增的行和列是否滿足所有元素都是 1。

class solution

int rows = matrix.length, columns = matrix[0].length;

for (int i = 0; i < rows; i++)

for (int m = 0; m < k; m++)

}if (flag) else }}

}}int maxsquare = maxside * maxside;

return maxsquare;}}

看著暴力法確實很麻煩,讓人看了就不想用。

那有沒有啥子好點的方法呢?看到求最大讓你想起了啥?對!就是動態規劃。

動態規劃的重點是找到狀態轉移方程。

下面是我的動態規劃解法**:

class solution {

public int maximalsquare(char matrix) {

int row = matrix.length;

if(row==0)return 0;

int col = matrix[0].length;

if(col==0)return 0;

int dp = new int[row][col];

int result = 0;

for(int i=0;iif(matrix[i][0]=='0')

dp[i][0]=0;

else

dp[i][0]=1;

result = math.max(result,dp[i][0]);

for(int i=0;iif(matrix[0][i]=='0')

dp[0][i]=0;

else

dp[0][i]=1;

result = math.max(result,dp[0][i]);

for(int i=1;ifor(int j=1;jif(matrix[i][j]=='1'){

dp[i][j]=math.min(dp[i-1][j-1],math.min(dp[i-1][j],dp[i][j-1]))+1;

result = math.max(result,dp[i][j]);

return result*result;

10月5日 正方形

題目 時間限制 1000ms記憶體限制 64000kb 題目描述 又到暑假啦,conan,ayumi,mitsuhiko,genta一起到hakase家愉快玩耍 然而你卻不行 ayumi,mitsuhiko,genta依次開始畫正方形 顯然ai是不會參加這個活動的 一人一筆,畫完乙個,以上乙個正方形...

最大正方形

題目鏈結 在乙個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個節...