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 000Order 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.)
Companies:
Facebook
Related Topics:
Dynamic Programming
Similar Questions:
// OJ: https://leetcode.com/problems/largest-plus-sign/
// Author: github.com/lzl124631x
// Time: O(N^2)
// Space: O(N^2)
class Solution {
public:
int orderOfLargestPlusSign(int N, vector<vector<int>>& A) {
vector<vector<int>> M(N, vector<int>(N, 1)), H(N, vector<int>(N)), V(N, vector<int>(N));
for (auto &v : A) {
M[v[0]][v[1]] = 0;
}
for (int i = 0; i < N; ++i) {
stack<int> s;
s.push(N);
for (int j = N - 1; j >= 0; --j) {
if (M[i][j] == 0) s.push(j);
}
int prev = -1;
for (int j = 0; j < N; ++j) {
if (M[i][j] == 0) {
s.pop();
prev = j;
} else H[i][j] = min(j - prev, s.top() - j);
}
}
for (int j = 0; j < N; ++j) {
stack<int> s;
s.push(N);
for (int i = N - 1; i >= 0; --i) {
if (M[i][j] == 0) s.push(i);
}
int prev = -1;
for (int i = 0; i < N; ++i) {
if (M[i][j] == 0) {
s.pop();
prev = i;
} else V[i][j] = min(i - prev, s.top() - i);
}
}
int ans = 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
ans = max(ans, min(H[i][j], V[i][j]));
}
}
return ans;
}
};
// OJ: https://leetcode.com/problems/largest-plus-sign/
// Author: github.com/lzl124631x
// Time: O(N^2)
// Space: O(N^2)
class Solution {
public:
int orderOfLargestPlusSign(int N, vector<vector<int>>& A) {
int ans = 0;
unordered_set<int> s;
vector<vector<int>> dp(N, vector<int>(N, 0));
for (auto &v : A) {
s.insert(v[0] * N + v[1]);
}
for (int i = 0; i < N; ++i) {
for (int j = 0, cnt = 0; j < N; ++j) {
cnt = s.count(i * N + j) ? 0 : (1 + cnt);
dp[i][j] = cnt;
}
for (int j = N - 1, cnt = 0; j >= 0; --j) {
cnt = s.count(i * N + j) ? 0 : (1 + cnt);
dp[i][j] = min(dp[i][j], cnt);
}
}
for (int j = 0; j < N; ++j) {
for (int i = 0, cnt = 0; i < N; ++i) {
cnt = s.count(i * N + j) ? 0 : (1 + cnt);
dp[i][j] = min(dp[i][j], cnt);
}
for (int i = N - 1, cnt = 0; i >= 0; --i) {
cnt = s.count(i * N + j) ? 0 : (1 + cnt);
dp[i][j] = min(dp[i][j], cnt);
ans = max(ans, dp[i][j]);
}
}
return ans;
}
};