LeetCode 764. Largest Plus Sign
Contents
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 1s 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:
1 | Order 1: |
Example 1:
1 | Input: N = 5, mines = [[4, 2]] |
Example 2:
1 | Input: N = 2, mines = [] |
Example 3:
1 | Input: N = 1, mines = [[0, 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.)
这道题对我来说挺坑的,我一开始不想用二位数组来保存mines的位置,而是使用set
\unordered_set
来保存,导致超时……后来又想了很久找到了另一种解法。
Brute force
对每一个点,都依次向外搜索最大的+,最坏时间复杂度为O(n3)。
1 | class Solution { |
DP
用四次二维DP,分别找到每个点的上下左右四个方向的最长的连续1的个数,然后对每一个点从这四个长度中选择最小值,就是该点的最大+大小。时间复杂度O(n2)。
要注意这个方法很容易超内存,所以我不得已把三维数组改成了二位数组循环利用四次。
1 | class Solution { |