As Far from Land as Possible
Link
Description
Given an n x n
grid
containing only values 0
and 1
, where0
represents waterand 1
represents land, find a water cell such that its distance to the nearest land cell is maximized, and return the distance.If no land or water exists in the grid, return -1
.
The distance used in this problem is the Manhattan distance:the distance between two cells (x0, y0)
and (x1, y1)
is |x0 - x1| + |y0 - y1|
.
Example 1:
| Input: grid = [[1,0,1],[0,0,0],[1,0,1]]
Output: 2
Explanation: The cell (1, 1) is as far as possible from all the land with distance 2.
|
Example 2:
| Input: grid = [[1,0,0],[0,0,0],[0,0,0]]
Output: 4
Explanation: The cell (2, 2) is as far as possible from all the land with distance 4.
|
Constraints:
n == grid.length
n == grid[i].length
1 <= n<= 100
grid[i][j]
is 0
or 1
Solution
BFS
| class Solution {
public:
int maxDistance(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
queue<pair<int, int>> que;
vector<vector<bool>> visited(n, vector<bool>(m, false));
int numOfSeas = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
visited[i][j] = true;
que.emplace(i, j);
} else {
numOfSeas++;
}
}
}
if (numOfSeas == 0 || numOfSeas == n * m) {
return -1;
}
array<int, 5> moves{-1, 0, 1, 0, -1};
int level = 0;
while (!que.empty()) {
level++;
int queueSize = que.size();
while (queueSize--) {
auto [x, y] = que.front();
que.pop();
for (int i = 0; i < 4; i++) {
int nextX = x + moves[i], nextY = y + moves[i + 1];
if (nextX >= 0 && nextX < n && nextY >= 0 && nextY < m && !visited[nextX][nextY]) {
visited[nextX][nextY] = true;
que.emplace(nextX, nextY);
}
}
}
}
return level - 1;
}
};
|
- Time complexity: \(O(NM)\);
- Space complexity: \(O(NM)\).