一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して9日目です。クリックしてイベントの詳細をご覧ください。
説明
0と1で満たされたmxnバイナリ行列が与えられた場合、1のみを含む最大の正方形を見つけて、その面積を返します。
例1:
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 4
复制代码
例2:
Input: matrix = [["0","1"],["1","0"]]
Output: 1
复制代码
ノート:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] is '0' or '1'.
复制代码
解析
質問の意味に応じて、mxn行列が与えられ、各グリッドは0または1で埋められ、1のみを含む最大の正方形の領域を見つけて返します。実際、この質問のタイトルを読んだ後、この種のカウント質問は基本的に動的計画法を使用する方が便利であることがわかります。dp[i] [j]は、右下隅のある正方形の最大の辺として定義されます。この位置での長さの式は次のとおりです。
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1
复制代码
写真で表示する方が明確になります。
最後に、正方形の最大面積を取得するには、正方形の辺の長さとしてdpの最大値を見つけるだけで済みます。実際、あなたがよく質問を書く友人であるなら、この質問は1277とほとんど同じであることを知っておくべきです。すべてのもので正方形の部分行列を数えます。
答え
import numpy
class Solution(object):
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
M = len(matrix)
N = len(matrix[0])
dp = [[0] * N for _ in range(M)]
for n in range(N):
dp[0][n] = int(matrix[0][n])
for m in range(M):
dp[m][0] = int(matrix[m][0])
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 - 1], dp[i - 1][j], dp[i][j - 1]) + 1
L = numpy.max(dp)
return L * L
复制代码
運転結果
Runtime: 213 ms, faster than 39.94% of Python online submissions for Maximal Square.
Memory Usage: 33.8 MB, less than 6.85% of Python online submissions for Maximal Square.
复制代码
元のタイトルリンク:leetcode.com/problems/ma…
あなたのサポートは私の最大の動機です