764.最大プラス記号
(0、0)から(N-1、N-1)の範囲のサイズの2Dグリッドグリッドでは、各セルは1です。ただし、鉱山で指定されたセルは0です。グリッドに1を含む最大の軸揃えプラス記号は何ですか?プラス記号の順序を返します。プラス記号が見つからない場合は、0を返します。
1からなるk "次数"軸対称 "プラス記号"には、中央グリッドグリッド[x] [y] = 1と、長さk-で中央から上下左右に伸びる4つの拡張があります。 1. 1で構成されるアーム。kの次数の「軸対称」プラス記号の例を以下に示します。プラス記号でマークされたすべてのグリッドは1である必要があることに注意してください。他のグリッドは0または1の場合があります。
次数kの軸対称プラス記号の例:
ステージ1:
000
010
000
ステージ2:
00000
00100
01110
00100
00000
ステップ3:
0000000
0001000
0001000
0111110
0001000
0001000
0000000
例1:
入力:N = 5、地雷= [[
4、2 ]] 出力:2
説明:
11111
11111
11111
11111
11011
上部グリッドでは、最大のプラス記号の順序は2のみです。図には標識が記されています。
例2:
入力:N = 2、地雷= []
出力:1
説明:
11
11
2次のプラス記号はなく、1次のプラス記号があります。
例3:
入力:N = 1、鉱山= [[0、0]]
出力:0
説明:
0
プラス記号がない場合、0を返します。
ヒント:
整数Nの範囲:[1、500]。地雷
の最大長は5000です。
地雷[i]は2の長さで、[0、N-1]の2つの数値で構成されます
(さらに、C、C ++を使用します。または、C#プログラミングは少し短い時間制限で判断されます。)
class Solution {
public int orderOfLargestPlusSign(int N, int[][] mines) {
if (N==0)return 0;
int max_k=0;
//填充一个2D网格matrix出来
int matrix[][] = new int[N][N];
for (int i=0;i<N;i++)
Arrays.fill(matrix[i],1);
int m = mines.length;
for (int i=0;i<m;i++)
matrix[mines[i][0]][mines[i][1]]=0;
int dp[][] = new int[N][N];
int count = 0;
//初始化
//求左、右
for (int i=0;i<N;i++){
//求左臂并将值放入dp left->right
count = 0;
for (int j=0;j<N;j++){
count = matrix[i][j]==1?count+1:0;
dp[i][j]= count;
}
//求右臂 并将当前dp与右臂之间的最小值放入dp right->left
count = 0;
for (int j=N-1;j>=0;j--){
count = matrix[i][j]==1?count+1:0;
dp[i][j]=Math.min(dp[i][j],count);
}
}
//求上、下
for (int j=0;j<N;j++){
//求上臂 并将当前dp与上臂间的最小值放入dp up->down
count = 0;
for (int i=0;i<N;i++){
count = matrix[i][j]==1?count+1:0;
dp[i][j]=Math.min(dp[i][j],count);
}
//求下臂 并将当前dp与下臂间的最小值放入dp down->up
//此时的整个dp数组中的最大值就是所求的k
count = 0;
for (int i=N-1;i>=0;i--){
count = matrix[i][j]==1?count+1:0;
dp[i][j]=Math.min(dp[i][j],count);
max_k=Math.max(max_k,dp[i][j]);
}
}
return max_k;
}
}