1、描述:1162
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。
我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。
如果我们的地图上只有陆地或者海洋,请返回 -1。
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、思路:
BFS搜索,陆地填海,使用queue
一次遍历,找出所有陆地,初始化队列,然后根据这个队列中的陆地,把附近的海洋找出来(和此一层陆地相接的海洋),填成陆地,添加到陆地队列,构成队列第二层陆地,(添加的同时把原来的陆地删除),然后再根据第二层陆地,填第3层海…
3、notes
1、如果把=写成==,会时间超限
2、BFS问题,就是一层一层的修理,使用queue,第一层初始化,第二层根据第一层构造,同时删除第一层,然后填海,
4、复杂度
时间:O ( n2 )
空间:O ( n )
5、code
class Solution {
public:
int maxDistance(vector<vector<int>>& grid) {
int n = grid.size(); //大小
queue<pair<int, int>> queList; //陆地队列,把座标添加到队列
for (int i = 0; i < n; i++) //第一次遍历,如果是1,就添加到陆地队列
{
for (int j = 0; j < n; j++)
{
if (grid[i][j] == 1)
queList.push({ i,j });
}
}
if (queList.size() == 0 || queList.size() == n * n) return -1;//全是陆地或者全是海洋返回-1
int count; //每一层的更新,
int res = 0; //统计最后最远的结果
while (!queList.empty()) //陆地队列不为空,
{
int queTemSize = queList.size(); //当前一层的陆地个数,
bool flag = false; // 判断新一层有没有新的陆地生成
int direct[5] = { 0,1,0,-1,0 }; // 方向
while (queTemSize--) // 一层判断完事
{
auto Val = queList.front(); //变量类型 pair<int,int>
queList.pop(); //首元素出队列
for (int i = 0; i < 4; i++) //四个方向
{
int nx = Val.first + direct[i]; //上下左右四周的下标
int ny = Val.second + direct[i + 1];
if (nx < 0 || ny < 0 || nx >= n || ny >= n || grid[nx][ny] == 1) { //不符合就跳过
continue;
}
queList.push({ nx,ny }); //四个方向有一个加一个
grid[nx][ny] = 1; //填海
flag = true; //整个一层while循环,有一个就够
}
}
if (flag) //加一层
res++;
}
return res;
}
};