[Programmers]-最大正方形を検索


1. Problem 📃


📚 ソース-プログラマ
問題の説明
表(プレート)は1と0で塗りつぶされます.表1は1 x 1の正方形からなる.表に1からなる最大正方形を見つけ、戻り幅の解関数を完了してください.△正方形とは、軸に平行な正方形のこと.
例:
12340111111111110010
もしあるならば、最大の正方形は
12340111111111110010
幅が9になるので、9を返せばいいです.
せいげんじょうけん
  • 表(ボード)は2次元配列です.
  • 表(板)の行(行)サイズ:1000以下自然数
  • 表(板)の列(列)サイズ:1000以下自然数
  • テーブル(プレート)の値は1または0のみです.
  • I/O例
    boardanswer[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]]9[[0,0,1,1],[1,1,1,1]]4
    I/O例説明
    I/O例#1
    上記の例のように.
    I/O例#2
    | 0 | 0 | 1 | 1 |
    | 1 | 1 | 1 | 1 |
    最大正方形の幅が4であるため、4を返します.

    2. Logic 👨‍🏫


    まずDPでこの問題を解決しました.
    左、上、左の対角線の3つの部分を比較します.
    それらの位置は以前にチェックされており、各位置に最大矩形のエッジの長さが格納されています.
    したがって、3つの位置において、最小値+1は、その領域が有する最大矩形幅の長さである.
    -ただ、気をつけて.左、上、左の対角線を比較するため、0行と0列からインデックスエラーが発生します.
    -上記のように、比較は現在の値が1の場合にのみ使用できます.
    例を挙げて以下のように説明する.TestCase 2に注目してみましょう.
    123400111👉 111
    👉 左(1)、上(0)、左(0)の対角線の最小値は0です.👉の双曲線コサインを返します.
    1234001111👉 11
    👉 左(1)、上(1)、左対角線(0)の最小値は0です.👉の双曲線コサインを返します.
    12340011111👉 2
    👉 左(1)、上(1)、左対角線(1)の最小値は1です.👉の双曲線コサインを返します.
    注意が必要な例外処理
    第1列
  • のみ受信
    たくさんあると思いましたが、これしか思いつかなかったので、とにかく!
  • 3. Code 💻


    1.私が解いたパスワード

    def solution(board):
        b_max = 0
        for i in range(len(board)):
            for j in range(len(board[i])):
                if i > 0 and j > 0 and board[i][j] == 1:
                    board[i][j] = min(board[i-1][j], board[i-1][j-1], board[i][j-1]) + 1
                b_max = max(b_max, board[i][j])
        return b_max**2