[python]プログラマー(Lv 2)-最大の正方形を検索


こんにちは:
https://programmers.co.kr/learn/courses/30/lessons/12905
0と1からなる配列の中で最大の正方形の問題を探します.下図に示します.

せいげんじょうけん
  • 表(ボード)は2次元配列です.
  • 表(板)の行(行)サイズ:1000以下自然数
  • 表(板)の列(列)サイズ:1000以下自然数
  • テーブル(プレート)の値は1または0のみです.
  • 制限では,rとcの長さは1000を超えてはならず,,,およびゲートは最大2回Oを必要とする(n^2).
    どうやって2回もforドアを回って答えを見つけることができるのか悩んでいました.結局答えが見つからなかったので検索しました
    解決策は,(i,j)位置の値を(i,j)位置で作成できる最大の正方形エッジ長にすることである.
    値を左(i,j−1)、上(i−1,j)、および対角線位置(i−1,j−1)から最小値+1に更新します.
    def solution(board):
        answer = 0
        r = len(board)
        c = len(board[0])
    
        square = [[0] * (c+1) for _ in range(r+1)]
    
        for i in range(r):
            for j in range(c):
                square[i+1][j+1] = board[i][j]
    
        for i in range(1, r+1):
            for j in range(1, c+1):
                if square[i][j] != 0:
                    square[i][j] = min(square[i-1][j], square[i][j-1], square[i-1][j-1]) + 1
                    answer = max(answer, square[i][j])
    
        return answer * answer
    ハングルを参照:
    [プログラマー]-最大正方形を検索