764. Largest Plus Sign
Description
You are given an integer n
. You have an n x n
binary grid grid
with all values initially 1
's except for some indices given in the array mines
. The ith
element of the array mines
is defined as mines[i] = [xi, yi]
where grid[xi][yi] == 0
.
Return the order of the largest axis-aligned plus sign of 1's contained in grid
. If there is none, return 0
.
An axis-aligned plus sign of 1
's of order k
has some center grid[r][c] == 1
along with four arms of length k - 1
going up, down, left, and right, and made of 1
's. Note that there could be 0
's or 1
's beyond the arms of the plus sign, only the relevant area of the plus sign is checked for 1
's.
Example 1:
Input: n = 5, mines = [[4,2]] Output: 2 Explanation: In the above grid, the largest plus sign can only be of order 2. One of them is shown.
Example 2:
Input: n = 1, mines = [[0,0]] Output: 0 Explanation: There is no plus sign, so return 0.
Constraints:
1 <= n <= 500
1 <= mines.length <= 5000
0 <= xi, yi < n
- All the pairs
(xi, yi)
are unique.
Solution
largest-plus-sign.py
class Solution:
def orderOfLargestPlusSign(self, n: int, mines: List[List[int]]) -> int:
dp = [[n] * n for _ in range(n)]
for x, y in mines:
dp[x][y] = 0
for i in range(n):
l = r = u = d = 0
for start, end in zip(range(n), reversed(range(n))):
l = l + 1 if dp[i][start] != 0 else 0
dp[i][start] = min(dp[i][start], l)
r = r + 1 if dp[i][end] != 0 else 0
dp[i][end] = min(dp[i][end], r)
u = u + 1 if dp[start][i] != 0 else 0
dp[start][i] = min(dp[start][i], u)
d = d + 1 if dp[end][i] != 0 else 0
dp[end][i] = min(dp[end][i], d)
return max(dp[i][j] for i in range(n) for j in range(n))