leetcode221 最大正方形

2021-10-05 21:09:50 字數 1577 閱讀 3079

在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。

示例:輸入:

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1

1 0 0 1 0

輸出: 4

遍歷整個二維陣列,如果遇到字元為『1』的元素,計算以它為正方形左上角元素的最大正方形面積。

首先要知道以該元素為正方形左上角的邊長最大值,正方形的長和寬不能超過矩形的行數和列數。

每當計算出乙個正方形時,給他的行和列都新增一行,判斷是否構成正方形。如果可以構成,繼續新增行和列,否則遍歷下乙個元素。

用matrix表示矩陣

用dp[i][j]表示從以i,j為下標的矩陣中存在的最大正方形的邊長。

如果matrix[0][0]為1,則dp[i][j]=1,否則dp[i][j]=0;

接著遍歷剩餘的矩陣元素。matrix[i][j]子矩陣可以存在的最大正方形的邊長為min(i,j)+1.

matrix[i][j-1]和maxtrix[i-1][j]子矩陣中可以存在的最大正方形邊長分別為min(i,j-1)+1和min(i-1,j)+1.

如果min(i,j)等於min(i,j-1)

如果dp[i][j-1]存在最大正方形邊長時,dp[i][j]=dp[i][j-1]

否則dp[i][j-1]中不存在正方形邊長最大值時,判斷以matrix[i][j]為右下角的正方形的邊長是否為dp[i][j-1]+1.如果存在,則dp[i][j]=dp[i][j-1]+1.則dp[i][j]=dp[i][j-1]

如果min(i,j)大於min(i,j-1)時

判斷以matrix[i][j]為右下角的正方形邊長是否為dp[i][j-1]+1.如果存在,則dp[i][j]=dp[i][j-1]+1.則dp[i][j]=dp[i][j-1]

還要用上述的方法判斷dp[i][j]與dp[i-1][j]的關係,取計算的dp[i][j]的最大值。

最後計算到dp[m-1][n-1],即為題目給出的矩陣的最大正方形邊長。

最後返回dp[m-1][n-1]* dp[m-1][n-1]

public static int maximalsquare(char matrixmatrix) 

}else

}if(j - 1 >= 0)

}else

}dp[i][j] = math.max(dp1,dp2);}}

return dp[m - 1][n - 1] * dp[m - 1][n - 1];

}public static boolean iscur(char matrix,int i,int j,int len)

}return true;

}

1.暴力搜尋的時間複雜度為o(mnmin(m,n)^2),其中m,n分別為矩陣的行數和列數

因為矩陣中的每個『1』都要遍歷,時間複雜度為o(mn)

對於每個『1』都要找邊長最大的正方形,該過程的時間複雜度為o(min(m,n)^2)

空間複雜度為o(1)

2動態規劃的時間複雜度為o(mn),只需要計算每個子矩陣的dp值即可。

空間複雜度為o(mn).

LeetCode221 最大正方形

在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4 動態規劃問題。設二維陣列dp m n 其中dp i j 表示以座標 i,j 為右下角元素的最大正方形的邊長。通過觀...

Leetcode 221 最大正方形

在乙個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 4 思路 和最大長方形類似 可以參照不過每次的max換位長和寬中選取最小值,算他們的平方 提交的 class solu...

LeetCode 221 最大正方形

題目描述 在乙個由 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矩陣維度相同的...