LeetCode 221 Medium 最大1矩形面積 Python
阿新 • • 發佈:2019-01-13
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