| Код до переделки:
class Solution:
def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
def isMagicSquare(r0, c0):
row_sums, col_sums, diag_sums = [0, 0, 0], [0, 0, 0], [0, 0]
uniques = set()
for r in range(r0, r0+3):
for c in range(c0, c0+3):
cell = grid[r][c]
if not (1 <= cell <= 9):
return False
else:
uniques.add(cell)
if len(uniques) < c - c0 + r - r0 + 1:
return False
else:
row_sums[r-r0] += cell
col_sums[c-c0] += cell
if r - r0 > 1 and row_sums[r-r0] != row_sums[r-r0-1]:
return False
diag_sums[0] += grid[r][c0+r-r0]
diag_sums[1] += grid[r][c0+r0+2-r]
if len(uniques) < 9:
return False
for c in range(2):
if col_sums[c] != col_sums[c+1]:
return False
return diag_sums[0] == diag_sums[1] == row_sums[0] == col_sums[0]
n, m = len(grid), len(grid[0])
magic_squares = 0
for r in range(n-2):
for c in range(m-2):
if isMagicSquare(r, c):
magic_squares += 1
return magic_squares
Код после переделки:
class Solution:
def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
def isMagic(r0, c0):
row_sums, col_sums, diag_sums = [0, 0, 0], [0, 0, 0], [0, 0]
uniques = set()
for r in range(r0, r0+3):
c_last = c0 + 2
for c in range(c0, c0+3):
cell = grid[r][c]
uniques.add(cell)
row_sums[r-r0] += cell
col_sums[c-c0] += cell
r_pos = r - r0
if r_pos > 1 and row_sums[r_pos] != row_sums[r_pos-1]:
return False
diag_sums[0] += grid[r][c0+r_pos]
diag_sums[1] += grid[r][c_last-r_pos]
if len(uniques) < 9:
return False
for c in range(2):
if col_sums[c] != col_sums[c+1]:
return False
return diag_sums[0] == diag_sums[1] == row_sums[0] == col_sums[0]
n, m = len(grid), len(grid[0])
magic_squares = 0
bad_cells = {(r, c) for c in range(m) for r in range(n)
if not (1 <= grid[r][c] <= 9)}
for r in range(n-2):
for c in range(m-2):
# based on research by lee215
# https://leetcode.com/problems/magic-squares-in-grid/discuss/133874/Python-5-and-43816729
# "The center of magic square must be 5."
if grid[r+1][c+1] == 5:
r_end, c_end = r + 2, c + 2
all_good = True
for r1, c1 in bad_cells:
if r <= r1 <= r_end and c <= c1 <= c_end:
all_good = False
break
if all_good and isMagic(r, c):
magic_squares += 1
return magic_squares
Если верить сайту, где я решал эту самую задачку, переделка кода сократила время его выполнения с 44 мс до 36 мс. Я ожидал большего, но хоть что-то... |