1277 統計全爲1的正方形子矩陣
給你一個 m * n 的矩陣,矩陣中的元素不是 0 就是 1,請你統計並返回其中完全由 1 組成的 正方形 子矩陣的個數。
輸入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
輸出:15
解釋:
邊長爲 1 的正方形有 10 個。
邊長爲 2 的正方形有 4 個。
邊長爲 3 的正方形有 1 個。
正方形的總數 = 10 + 4 + 1 = 15.
算法思路
我們用 f[i][j]
表示以 (i, j)
爲右下角的正方形的最大邊長,那麼除此定義之外,f[i][j] = x
也表示以 (i, j)
爲右下角的正方形的數目爲 x(即邊長爲 1, 2, …, x 的正方形各一個)。在計算出所有的 f[i][j]
後,我們將它們進行累加,就可以得到矩陣中正方形的數目。
class Solution:
def countSquares(self, matrix: List[List[int]]) -> int:
if not matrix:return 0
res=0
m, n = len(matrix), len(matrix[0])
dp = [[0] * (n) for _ in range(m)]
for i in range(m):
for j in range(n):
if i==0 or j==0:
dp[i][j]=matrix[i][j]
elif matrix[i][j] == 1:
dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
else:
dp[i][j]=0
res+=dp[i][j]
return res
221 最大正方形
在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。
算法思路
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
if not matrix:
return 0
m, n = len(matrix), len(matrix[0])
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if matrix[i - 1][j - 1] == '1':
dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
return max(map(max, dp)) ** 2