Description
Given an n x n
grid
containing only values 0
and 1
, where 0
represents water and 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]
is0
or1
Code
similar to 01 Matrix
class Solution {
public:
int maxDistance(vector<vector<int>>& grid) {
queue<pair<int, int>> q;
int n = grid.size();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == 1)
q.push({i, j});
}
}
if(q.empty() || q.size() == n * n) return -1;
vector<int> dir = {-1, 0, 1, 0, -1};
int level = -1;
while(!q.empty()) {
int levelNum = q.size();
for(int i = 0; i < levelNum; i++) {
auto land = q.front(); q.pop();
int x = land.first;
int y = land.second;
for(int k = 0; k < 4; k++) {
int newX = x + dir[k];
int newY = y + dir[k + 1];
if(newX >= 0 && newX < grid.size() && newY >=0 && newY < grid[0].size() && grid[newX][newY] == 0) {
grid[newX][newY] = -1;
q.push({newX, newY});
}
}
}
level++;
}
return level;
}
};