LeetCode 221 最大正方形

2021-10-05 21:53:42 字數 2877 閱讀 6197

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

示例:輸入: 

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1

1 0 0 1 0

輸出: 4

class solution }}

return max*max;}}

class solution 

cur[j - 1] = 0;// 本行用不到的結果置0,為下一行做準備。

}pre[n] = cur[n];

cur[n] = 0;

}return max*max;}}

暴力求解法:

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

該方法簡單直觀,具體思路如下:

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

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

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

class solution 

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

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

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

}if(flag)else}}

}}int maxsquare = maxside * maxside;

return maxsquare;}}

複雜度分析

時間複雜度:o(mn \min(m,n)^2)o(mnmin(m,n) 

2),其中 mm 和 nn 是矩陣的行數和列數。

需要遍歷整個矩陣尋找每個 11,遍歷矩陣的時間複雜度是 o(mn)o(mn)。

對於每個可能的正方形,其邊長不超過 mm 和 nn 中的最小值,需要遍歷該正方形中的每個元素判斷是不是只包含 11,遍歷正方形時間複雜度是 o(\min(m,n)^2)o(min(m,n) 2)。

總時間複雜度是 o(mn \min(m,n)^2)o(mnmin(m,n) 2)。

空間複雜度:o(1)o(1)。額外使用的空間複雜度為常數。

方法二:動態規劃

方法一雖然直觀,但是時間複雜度太高,有沒有辦法降低時間複雜度呢?

可以使用動態規劃降低時間複雜度。我們用 dp(i, j)dp(i,j) 表示以 (i, j)(i,j) 為右下角,且只包含 11 的正方形的邊長最大值。如果我們能計算出所有 dp(i, j)dp(i,j) 的值,那麼其中的最大值即為矩陣中只包含 11 的正方形的邊長最大值,其平方即為最大正方形的面積。

那麼如何計算 dpdp 中的每個元素值呢?對於每個位置 (i, j)(i,j),檢查在矩陣中該位置的值:

如果該位置的值是 00,則 dp(i, j) = 0dp(i,j)=0,因為當前位置不可能在由 11 組成的正方形中;

如果該位置的值是 11,則 dp(i, j)dp(i,j) 的值由其上方、左方和左上方的三個相鄰位置的 dpdp 值決定。具體而言,當前位置的元素值等於三個相鄰位置的元素中的最小值加 11,狀態轉移方程如下:

dp(i, j)=min(dp(i−1, j), dp(i−1, j−1), dp(i, j−1))+1

dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1

如果讀者對這個狀態轉移方程感到不解,可以參考 1277. 統計全為 1 的正方形子矩陣的官方題解,其中給出了詳細的證明。

此外,還需要考慮邊界條件。如果 ii 和 jj 中至少有乙個為 00,則以位置 (i, j)(i,j) 為右下角的最大正方形的邊長只能是 11,因此 dp(i, j) = 1dp(i,j)=1。

以下用乙個例子具體說明。原始矩陣如下。

0 1 1 1 0

1 1 1 1 0

0 1 1 1 1

0 1 1 1 1

0 0 1 1 1

對應的 dpdp 值如下。

0 1 1 1 0

1 1 2 2 0

0 1 2 3 1

0 1 2 3 2

0 0 1 2 3

下圖也給出了計算 dpdp 值的過程。

複雜度分析

時間複雜度:o(mn)o(mn),其中 mm 和 nn 是矩陣的行數和列數。需要遍歷原始矩陣中的每個元素計算 dp 的值。

空間複雜度:o(mn)o(mn),其中 mm 和 nn 是矩陣的行數和列數。建立了乙個和原始矩陣大小相同的矩陣 dp。由於狀態轉移方程中的 dp(i, j)dp(i,j) 由其上方、左方和左上方的三個相鄰位置的 dpdp 值決定,因此可以使用兩個一維陣列進行狀態轉移,空間複雜度優化至 o(n)o(n)。

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矩陣維度相同的...