1277 統計全爲 1 的正方形子矩陣(動態規劃)

1. 問題描述:

給你一個 m * n 的矩陣,矩陣中的元素不是 0 就是 1,請你統計並返回其中完全由 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.
示例 2:
輸入:matrix = 
[
  [1,0,1],
  [1,1,0],
  [1,1,0]
]
輸出:7
解釋:
邊長爲 1 的正方形有 6 個。 
邊長爲 2 的正方形有 1 個。
正方形的總數 = 6 + 1 = 7.
提示:
1 <= arr.length <= 300
1 <= arr[0].length <= 300
0 <= arr[i][j] <= 1

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones

2. 思路分析:

① 一開始的時候對於也想到了應該會是動態規劃的思路來解決,但是沒有想到具體的解決方案,動態規劃的難點一般也是在這裏,在官方的題解中提供的思路是使用一個二維的list列表來記錄中間的結果,dp[i][j]表示以當前的i,j位置的正方形的個數,能夠想到這個思路也是非常巧妙的,當是第一行或者是第一列的時候那麼dp[i][j]就等於原矩陣的值,當矩陣的值爲0的時候那麼dp列表的這個位置也是爲0,爲1的爲當前位置的左邊、上邊與左上角的dp數組的最小值再加上1即可

② 對於這種使用動態規劃思路來解決的問題,需要多練習與所思考纔有思路

3. 代碼如下:

class Solution:
    # 這個計算正方形的子矩陣動態規劃的方法的思路是非常值得借鑑的
    def countSquares(self, matrix: List[List[int]]) -> int:
        r, c = len(matrix), len(matrix[0])
        # 初始化二維列表元素爲0
        dp = [[0] * c for _ in range(r)]
        res = 0
        for i in range(r):
            for j in range(c):
                if i == 0 or j == 0:
                    dp[i][j] = matrix[i][j]
                elif matrix[i][j] == 0:
                    dp[i][j] = 0
                else:
                    dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
                res += dp[i][j]
                print(dp[i][j], end=" ")
        return res

 

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