在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1。mines[i] = [xi, yi]表示 grid[xi][yi] == 0

返回 grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0 。

一个 k 阶由 1 组成的 “轴对称”加号标志 具有中心网格 grid[r][c] == 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0 也可能为 1 。



示例 1:

输入: n = 5, mines = [[4, 2]]
输出: 2
解释: 在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。

示例 2:

输入: n = 1, mines = [[0, 0]]
输出: 0
解释: 没有加号标志,返回 0 。



提示:

1 <= n <= 500
1 <= mines.length <= 5000
0 <= xi, yi < n
每一对 (xi, yi) 都 不重复
  • 对于每个位置枚举4个方向上连续1的个数,取4个方向中的最小值即可。对于4个方向上1的连续个数可以通过预处理提前求出。
  • 时间复杂度:Leetcode 764. 最大加号标志_预处理
  • 空间复杂度:Leetcode 764. 最大加号标志_预处理
class Solution {
public int orderOfLargestPlusSign(int n, int[][] mines) {
int ans = 0;
int[][] le = new int[n + 5][n + 5], r = new int[n + 5][n + 5], up = new int[n + 5][n + 5], d = new int[n + 5][n + 5], g = new int[n + 5][n + 5];
for (int i = 0; i < mines.length; i++) g[mines[i][0] + 1][mines[i][1] + 1] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g[i][j] == 0) {
le[i][j] += le[i][j - 1] + 1;
up[i][j] += up[i - 1][j] + 1;
}
}
}
for (int i = n; i >= 1; i--) {
for (int j = n; j >= 1; j--) {
if (g[i][j] == 0) {
r[i][j] += r[i][j + 1] + 1;
d[i][j] += d[i + 1][j] + 1;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
ans = Math.max(ans, Math.min(Math.min(r[i][j], le[i][j]), Math.min(up[i][j], d[i][j])));
}
}
return ans;
}
}