764. 最大加号标志

在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1mines[i] = [xi, yi] 表示 grid[xi][yi] == 0
返回  grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0

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

dp

暴力

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public int orderOfLargestPlusSign(int n, int[][] mines) {
boolean[][] map = new boolean[n][n];
for (int i = 0; i < mines.length; i++) {
int x = mines[i][0];
int y = mines[i][1];
map[x][y] = true;
}

int m = n % 2 == 0 ? n - 1: n;
for (; m > 0; m -= 2) {
// i => 上下偏移
for (int i = 0; i <= n - m; i++) {
// j => 左右偏移
for (int j = 0; j <= n - m; j++) {
// 横向
int x = m / 2 + i;
int y = j;
for (; y < j + m; y++) {
if (map[x][y]) break;
}
// 横向有 0
if (y != j + m) {
continue;
}

// 纵向
x = i;
y = m / 2 + j;
for (; x < i + m; x++) {
if (map[x][y]) break;
}
// 可行,返回
if (x == i + m) {
return m / 2 + 1;
}
}
}
}

return 0;
}
}