221 Maximal Square 最大正方形
Description:
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
Example:
Input:
1 0 1 0 0
1 0 1 1 0
1 1 1 1 1
1 0 0 1 0
Output: 4
題目描述:
在一個(gè)由 0 和 1 組成的二維矩陣內(nèi),找到只包含 1 的最大正方形,并返回其面積。
示例 :
輸入:
1 0 1 0 0
1 0 1 1 0
1 1 1 1 1
1 0 0 1 0
輸出: 4
思路:
動(dòng)態(tài)規(guī)劃
一個(gè)正方形只用考慮其邊長(zhǎng)
dp[i][j]表示 matrix[i - 1][j - 1]能夠得到的最大的正方形的邊長(zhǎng)
由于 dp[i][j]受限于左邊, 左上角和上方的邊長(zhǎng), 可以得到狀態(tài)轉(zhuǎn)移方程:
dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j - 1], dp[i - 1][j]), matrix[i - 1][j - 1] == '1'
dp[i][j] = 0, matrix[i - 1][j - 1] == '0'
可以看到, 每次更新只需要臨近兩行, 可以將左上角的記錄下來(lái), 這樣每次只需要一行就可以更新, 空間復(fù)雜度可以壓縮到 O(n)
時(shí)間復(fù)雜度O(mn), 空間復(fù)雜度O(n), 其中 m為 matrix的大小, n為 matrix[0]的大小
代碼:
C++:
class Solution
{
public:
int maximalSquare(vector<vector<char>>& matrix)
{
int result = 0, temp = 0;
if (matrix.empty()) return result;
vector<int> dp(matrix[0].size() + 1, 0);
for (auto &row : matrix)
{
temp = 0;
for (int j = 1; j < matrix[0].size() + 1; j++)
{
int next = dp[j];
if (row[j - 1] == '1')
{
dp[j] = 1 + min({dp[j - 1], temp, dp[j]});
result = max(result, dp[j]);
}
else dp[j] = 0;
temp = next;
}
}
return result * result;
}
};
Java:
class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix.length == 0) return 0;
int dp[][] = new int[matrix.length + 1][matrix[0].length + 1], result = 0;
for (int i = 1; i < matrix.length + 1; i++) for (int j = 1; j < matrix[0].length + 1; j++) {
if (matrix[i - 1][j - 1] == '1') {
dp[i][j] = 1 + Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j - 1]));
result = Math.max(result, dp[i][j]);
}
}
return result * result;
}
}
Python:
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
dp, result = [[0] * (len(matrix[0]) + 1) for _ in range(len(matrix) + 1)], 0
for i in range(1, len(matrix) + 1):
for j in range(1, len(matrix[0]) + 1):
if matrix[i - 1][j - 1] == '1':
dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j - 1], dp[i - 1][j])
result = max(result, dp[i][j])
return result ** 2