In a 2D
grid
from (0, 0) to (N-1, N-1), every cell contains a 1
, except those cells in the given list mines
which are 0
. What is the largest axis-aligned plus sign of 1
s contained in the grid? Return the order of the plus sign. If there is none, return 0.
An "axis-aligned plus sign of
1
s of order k" has some center grid[x][y] = 1
along with 4 arms of length k-1
going up, down, left, and right, and made of 1
s. This is demonstrated in the diagrams below. Note that there could be 0
s or 1
s beyond the arms of the plus sign, only the relevant area of the plus sign is checked for 1s.
Examples of Axis-Aligned Plus Signs of Order k:
Order 1: 000 010 000 Order 2: 00000 00100 01110 00100 00000 Order 3: 0000000 0001000 0001000 0111110 0001000 0001000 0000000
Example 1:
Input: N = 5, mines = [[4, 2]] Output: 2 Explanation: 11111 11111 11111 11111 11011 In the above grid, the largest plus sign can only be order 2. One of them is marked in bold.
Example 2:
Input: N = 2, mines = [] Output: 1 Explanation: There is no plus sign of order 2, but there is of order 1.
Example 3:
Input: N = 1, mines = [[0, 0]] Output: 0 Explanation: There is no plus sign, so return 0.
Note:
N
will be an integer in the range[1, 500]
.mines
will have length at most5000
.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.)
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 44 45 46 47 48 49 50 51 52 53 54 | class Solution { public int orderOfLargestPlusSign( int N, int [][] mines) { Set<Integer> set = new HashSet<>(); for ( int [] pair : mines) { set.add(pair[ 0 ] * N + pair[ 1 ]); } int [][] dp = new int [N][N]; int ans = 0 ; for ( int i = 0 ; i < N; i++) { int count = 0 ; // left // for ( int j = 0 ; j < N; j++) { count = set.contains(i * N + j) ? 0 : count + 1 ; dp[i][j] = count; } // right // count = 0 ; for ( int j = N - 1 ; j >= 0 ; j--) { count = set.contains(i * N + j) ? 0 : count + 1 ; dp[i][j] = Math.min(dp[i][j], count); } } for ( int j = 0 ; j < N; j++) { int count = 0 ; // up // for ( int i = 0 ; i < N; i++) { count = set.contains(i * N + j) ? 0 : count + 1 ; dp[i][j] = Math.min(dp[i][j], count); } count = 0 ; // down // for ( int i = N - 1 ; i >= 0 ; i--) { count = set.contains(i * N + j) ? 0 : count + 1 ; dp[i][j] = Math.min(dp[i][j], count); ans = Math.max(ans,dp[i][j]); } } return ans; } } |
No comments:
Post a Comment