Letcode 221 최대 정사각형

1523 단어
제목 전송문
제목: 0과 1로 구성된 2차원 행렬에서 1만 포함된 최대 정사각형을 찾아 그 면적을 되돌려줍니다.
예:
입력:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

  : 4

분석:
  • 동적 기획, 문제는 최대 정사각형 변장을 구하는 것으로 전환
  • 2차원 매트릭스 구축 dp[M][N] 그 중에서 M, N은 각각 원 2차원 매트릭스의 높이와 너비
  • 행렬의 한 점 dp[i][j]는matrix[i][j]이 점을 오른쪽 하단 단점의 최대 정사각형으로 길이를 나타낸다. 만약matrix[i][j]='0'으로 하면 이 단점은 정사각형을 구성할 수 없고 가장자리 길이는 0
  • 이다.
  • 행렬의 각 점은 정사각형의 오른쪽 아래 끝점으로 최대 정사각형의 모서리 길이를 구성할 수 있다. 또는 이 점의 왼쪽, 위, 왼쪽 위의 인접한 끝점이 최대 정사각형 모서리 길이를 구성할 수 있는 최소값에 1(이 점은'1')을 더하거나 0(이 점은 0)
  • 을 더할 수 있다.
  • 동적 이동 방정식: dp[i][j]=min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1(이 점은'1') dp[i][j]=0(이 점은'0')
  • Python3 코드:
    class Solution:
        def maximalSquare(self, matrix):
            """
            :type matrix: List[List[str]]
            :rtype: int
            """
            if matrix == []: return 0 
            M, N = len(matrix), len(matrix[0])
            dp = [[0 for _ in range(N)]for _ in range(M)]
            Max = 0
            for i in range(N):   # dp     
                dp[0][i] = int(matrix[0][i])
                Max = max(dp[0][i], Max)
            for i in range(M):   # dp     
                dp[i][0] = int(matrix[i][0])
                Max = max(dp[i][0], Max)
            for i in range(1, M):
                for j in range(1, N):
                    if matrix[i][j] == '0': continue
                    dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
                    Max = max(dp[i][j], Max)
            return Max**2
    

    좋은 웹페이지 즐겨찾기