1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| from typing import List
class Solution:
def factors(self, i: int, f: int) -> int:
return 0 if i % f else 1 + self.factors(i // f, f)
def pairs(self, p) -> int:
return min(p[0], p[1])
def maxTrailingZeros(self, grid: List[List[int]]) -> int:
m, n, res = len(grid), len(grid[0]), 0
h = [[(0, 0)] * (n + 1) for _ in range(m)]
v = [[(0, 0)] * n for _ in range(m + 1)]
for i in range(m):
for j in range(n):
f25 = (self.factors(grid[i][j], 2), self.factors(grid[i][j], 5))
v[i + 1][j] = (v[i][j][0] + f25[0], v[i][j][1] + f25[1])
h[i][j + 1] = (h[i][j][0] + f25[0], h[i][j][1] + f25[1])
for i in range(m):
for j in range(n):
v1, v2 = v[i + 1][j], (v[m][j][0] - v[i][j][0], v[m][j][1] - v[i][j][1])
h1, h2 = h[i][j], (h[i][n][0] - h[i][j + 1][0], h[i][n][1] - h[i][j + 1][1])
res = max(res, self.pairs((v1[0] + h1[0], v1[1] + h1[1])), self.pairs((v1[0] + h2[0], v1[1] + h2[1])),
self.pairs((v2[0] + h1[0], v2[1] + h1[1])), self.pairs((v2[0] + h2[0], v2[1] + h2[1])))
return res
|