1. 程式人生 > >LeetCode 221 Medium 最大1矩形面積 Python

LeetCode 221 Medium 最大1矩形面積 Python

def maximalSquare(self, matrix):
    """
    My Method
    演算法:動規
    思路:
        用dp[i][j]記錄以matrix[i][j]為"1"矩形的右下角的矩形的最大邊長
        matrix[i][j] == 0 的顯然dp[i][j] == 0
        對matrix[i][j] == 1的來說,如果在第一行或者第一列,顯然dp[i][j]=1,最大也就是這麼大了
        對於其他位置,
        像下面這樣,右下角的那個1稱之為matrix[i][j],那麼要檢查它的左,上,左上三個位置是否都為1,
        如果這三個位置有一個不為1的,那麼顯然以i,j為最大矩形的右下角的那個矩形,只能是matrix[i][j]本身
        那麼dp[i][j] =1
        否則就要看這三個位置的dp情況,可以看到,如果右下角的i,j代表的那個矩形,如果想擴充邊長的話,其
        值應該是dp[i][j] = min(dp[左],dp[上],dp[左上])+1,如此便可以構建狀態轉移方程
            1 1         1 1 1       0 1 1
            1 1   -->   1 1 1  vs   1 1 1
                        1 1 1       1 1 1
    """
    if matrix == [] or matrix[0] == []:
        return 0
    n = len(matrix)
    m = len(matrix[0])
    dp = [[0] * m for _ in range(n)]
    ans = 0
    for i in range(n):
        for j in range(m):
            if i == 0 or j == 0:
                dp[i][j] = int(matrix[i][j])
            elif matrix[i][j] == '1':
                if matrix[i - 1][j - 1] == '1' and matrix[i][j - 1] == '1' and matrix[i - 1][j] == '1':
                    dp[i][j] = min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1
                else:
                    dp[i][j] = 1
            else:
                dp[i][j] = 0
            ans = max(ans, dp[i][j])
    return ans ** 2

def maximalSquare1(self, matrix):
    """
    Solution Method
    事實上,在狀態轉移時,可以不用管上下左右是不是'1',如果不是1的話,那麼最小值就是0,當前值就是0+1 = 1
    0 1
    1 1
    其實就是把我冗餘的判斷精簡了
    """
    if matrix == [] or matrix[0] == []:
        return 0
    n = len(matrix)
    m = len(matrix[0])
    dp = [[0] * m for _ in range(n)]
    ans = 0
    for i in range(n):
        for j in range(m):
            if i == 0 or j == 0:
                dp[i][j] = int(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
            ans = max(ans, dp[i][j])
    return ans ** 2