Largest Plus Sign(DP)
Order 1:
000
0
1
0
000
Order 2:
00000
00
1
00
0
111
0
00
1
00
00000
Order 3:
0000000
000
1
000
000
1
000
0
11111
0
000
1
000
000
1
000
0000000Last updated
Order 1:
000
0
1
0
000
Order 2:
00000
00
1
00
0
111
0
00
1
00
00000
Order 3:
0000000
000
1
000
000
1
000
0
11111
0
000
1
000
000
1
000
0000000Last updated
Input:
N = 5, mines = [[4, 2]]
Output:
2
Explanation:
11111
11111
1
1
111
111
11
1
1
011
In the above grid, the largest plus sign can only be order 2. One of them is marked in bold.Input:
N = 2, mines = []
Output:
1
Explanation:
There is no plus sign of order 2, but there is of order 1.Input:
N = 1, mines = [[0, 0]]
Output:
0
Explanation:
There is no plus sign, so return 0.N will be an integer in the range [1, 500].
mines will have length at most 5000.
mines[i] will be length 2 and consist of integers in the range [0, N-1].
(Additionally, programs submitted in C, C++, or C# will be judged with a slightly smaller time limit.)class Solution {
public int orderOfLargestPlusSign(int N, int[][] mines) {
int[][] dp = new int[N][N];
for (int i = 0; i < N; i++) {
Arrays.fill(dp[i], N);
}
for(int[] p : mines){
dp[p[0]][p[1]] = 0;
}
for (int i = 0; i < N; i++){
// for(int j = 0, l = 0; j < N; j ++){
// dp[i][j] = Math.min(dp[i][j], l = dp[i][j] == 0 ? 0 : l + 1);
// }
// for(int j = N-1, r = 0; j >= 0; j --){
// dp[i][j] = Math.min(dp[i][j], r = dp[i][j] == 0 ? 0 : r + 1);
// }
// for(int j = 0, u = 0; j < N; j ++){
// dp[j][i] = Math.min(dp[j][i], u = dp[j][i] == 0 ? 0 : u + 1);
// }
// for(int j = N-1, d = 0; j >= 0; j --){
// dp[j][i] = Math.min(dp[j][i], d = dp[j][i] == 0 ? 0 : d + 1);
// }
//注意这种简写法。
for(int j=0,l=0,r=0,u=0,d = 0, k = N-1; j < N; j ++, k --){
dp[i][j] = Math.min(dp[i][j], l = dp[i][j] == 0 ? 0 : l + 1);
dp[i][k] = Math.min(dp[i][k], r = dp[i][k] == 0 ? 0 : r + 1);
dp[j][i] = Math.min(dp[j][i], u = dp[j][i] == 0 ? 0 : u + 1);
dp[k][i] = Math.min(dp[k][i], d = dp[k][i] == 0 ? 0 : d + 1);
}
}
int o = 0;
for (int i = 0; i < N; i++) {
for (int j = 0, l = 0; j < N; j++) {
o = Math.max(dp[i][j],o);
}
}
return o;
}
}