Given a m x n matrix mat and an integer threshold, return the maximum side-length of a square with a sum less than or equal to threshold or return 0 if there is no such square.

길이가 300 이하이기 때문에 O(N^2) 까지의 알고리즘은 사용 가능하다.
class Solution:
def space(self, start_row: int, start_col: int, end_row: int, end_col: int) -> int:
init_space = self.prefixes[end_row][end_col]
removed = 0
if start_row > 0:
init_space -= self.prefixes[start_row - 1][end_col]
removed += 1
if start_col > 0:
init_space -= self.prefixes[end_row][start_col - 1]
removed += 1
if removed > 1:
init_space += self.prefixes[start_row - 1][start_col - 1]
return init_space
def maxSideLength(self, mat: List[List[int]], threshold: int) -> int:
self.ROW = len(mat)
self.COL = len(mat[0])
self.prefixes = [[0] * self.COL for _ in range(self.ROW)]
self.prefixes[0][0] = mat[0][0]
for r in range(1, self.ROW):
self.prefixes[r][0] = self.prefixes[r - 1][0] + mat[r][0]
for c in range(1, self.COL):
self.prefixes[0][c] = self.prefixes[0][c - 1] + mat[0][c]
for r in range(1, self.ROW):
for c in range(1, self.COL):
self.prefixes[r][c] = self.prefixes[r - 1][c] + self.prefixes[r][c - 1] + mat[r][c]
self.prefixes[r][c] -= self.prefixes[r - 1][c - 1]
ans = 0
for r in range(self.ROW):
for c in range(self.COL):
size_available = min(self.ROW - r, self.COL - c)
for size in range(ans, size_available):
s = self.space(r, c, r + size, c + size)
if s <= threshold:
ans = max(ans, size + 1)
else:
break
return ans
O(MN∗logmin(M,N)) 이 드는 이진탐색보다 오히려 낫고, 로직도 간단해서 좋다