在一个 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个方向进行辐射,我们可以定义4个数组来进行维护,分别表示的意思是上下左右四个方向连续1的个数,然后在遍历一遍,取这四个方向的最小值中的最大值就OK了,就是有点麻烦,一个体力活
class Solution {
public int orderOfLargestPlusSign(int n, int[][] mines) {
int res = 0 ;
int grid [][]= new int[n][n];
for (int i =0 ;i<n;i++){
Arrays.fill(grid[i],1);
}
for (int i =0 ;i<mines.length;i++){
grid[mines[i][0]][mines[i][1]] = 0 ;
}
int up [][] = new int[n][n];
int down [][] = new int[n][n];
int left [][] = new int[n][n];
int right [][] = new int[n][n];
for (int i =0 ;i<n ;i++){
int count =0 ;
for (int j =0 ;j<n;j++){
if (grid[i][j]==0){
count = 0 ;
}else {
count+=1 ;
}
left[i][j] = count ;
}
count =0 ;
for (int j = n-1 ; j>=0;j--){
if (grid[i][j]==0){
count =0 ;
}else {
count++ ;
}
right[i][j] = count ;
}
}
for (int j =0 ;j<n;j++){
int count =0 ;
for (int i =0 ;i<n;i++){
if (grid[i][j]==0){
count = 0 ;
}else {
count++ ;
}
up[i][j] =count ;
}
count =0 ;
for (int i= n-1 ;i>=0 ;i--){
if (grid[i][j]==0){
count = 0 ;
}else {
count++ ;
}
down[i][j] =count ;
}
}
for (int i =0 ;i<n ;i++){
for (int j =0 ;j< n ;j++){
int cnt = Math.min(Math.min(up[i][j],down[i][j]),Math.min(right[i][j],left[i][j]));
res = Math.max(cnt,res) ;
}
}
return res ;
}
}