【力扣】221 最大正方形 |1277 | 動態規劃

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章