[Leetcode] 764. Largest Plus Sign 解题报告
2018-03-20 16:51
597 查看
题目:
In a 2D
except those cells in the given list
What is the largest axis-aligned plus sign of
of the plus sign. If there is none, return 0.
An "axis-aligned plus sign of
has some center
up, down, left, and right, and made of
Note that there could be
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:
Example 1:
Example 2:
Example 3:
Note:
(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;
}
};
In a 2D
gridfrom (0, 0) to (N-1, N-1), every cell contains a
1,
except those cells in the given list
mineswhich are
0.
What is the largest axis-aligned plus sign of
1s 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] = 1along with 4 arms of length
k-1going
up, down, left, and right, and made of
1s. This is demonstrated in the diagrams below.
Note that there could be
0s or
1s
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:
Nwill be an integer in the range
[1, 500].
mineswill 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;
}
};
相关文章推荐
- LeetCode | 764. Largest Plus Sign中等偏难 二维数组找规律题
- [leetcode] 369. Plus One Linked List 解题报告
- [leetcode] 369. Plus One Linked List 解题报告
- LeetCode Plus One Java版解题报告
- [Leetcode] 369. Plus One Linked List 解题报告
- [Leetcode] 87. Scramble String 解题报告
- Leetcode 115. Distinct Subsequences 计算子串 解题报告
- [Leetcode] 386. Lexicographical Numbers 解题报告
- 【LeetCode】Path Sum 解题报告
- [leetcode] 207. Course Schedule 解题报告
- 【LeetCode】Longest Palindrome 解题报告
- [leetcode]209. Minimum Size Subarray Sum@Java解题报告
- LeetCode解题报告--4Sum
- 【LeetCode】676. Implement Magic Dictionary 解题报告(Python)
- [leetcode] 454. 4Sum II 解题报告
- Leetcode 67. Add Binary 二进制加法 解题报告
- Leetcode解题报告:94. Binary Tree Inorder Traversal
- LeetCode 409. Longest Palindrome 解题报告
- [leetcode] 75. Sort Colors 解题报告
- 【LeetCode】657. Judge Route Circle 解题报告