您的位置:首页 > 其它

[Leetcode] 764. Largest Plus Sign 解题报告

2018-03-20 16:51 597 查看
题目

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
bb6e
.  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 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.)
思路

1) 我们定义一个N*N的矩阵grid,将其每一个元素初始化为N,并且将mines列表中的元素置为0;

2)对于每个位置(i, j),我们分别在四个方向上找出最大值,然后将grid[i][j]的值置为四个方向上的最大值的最小者。我们需要注意的是,在每个方向上的最大值其实和它周围的元素的最大值是有递推关系的,我们利用这些递推关系可以实现时间复杂度的降低。

3)通过循环,找出grid中的最大值,即为题目所求。

该算法的时间复杂度为O(n^2),空间复杂度也是O(n^2)。

代码

class Solution {
public:
int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
vector<vector<int>> grid(N, vector<int>(N, N));
for (auto& m : mines) { // initialize the elements in grid
grid[m[0]][m[1]] = 0;
}
for (int i = 0; i < N; ++i) {
int l = 0, r = 0, u = 0, d = 0;
for (int j = 0, k = N - 1; j < N; j++, k--) {
grid[i][j] = min(grid[i][j], l = (grid[i][j] == 0 ? 0 : l + 1));
grid[i][k] = min(grid[i][k], r = (grid[i][k] == 0 ? 0 : r + 1));
grid[j][i] = min(grid[j][i], u = (grid[j][i] == 0 ? 0 : u + 1));
grid[k][i] = min(grid[k][i], d = (grid[k][i] == 0 ? 0 : d + 1));
}
}
int res = 0; // find the largest element in grid
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
res = max(res, grid[i][j]);
}
}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: