
一、题目描述

二、算法原理
思路:创建一个二维数组初始化为 -1,使用 BFS 算法先放置水域的高度,再放置非水域的高度;
1)创建二维数组,作用:1.最终答案、2.防止遍历过
2)使用 BFS 算法先放置的水域的高度,因为求的是高度的最大值,所以水域的上下左右的高度为 1:

3)非水域的上下左右的高度等于水域的上下左右的任意一个值加1,因为我们的高度的最大值而且题目的差值为1:

三、代码实现
cpp
class Solution {
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
typedef pair<int,int> PII;
public:
vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
int n = isWater.size(),m = isWater[0].size();
vector<vector<int>> vis(n,vector<int>(m,-1));
queue<PII> que;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(isWater[i][j] == 1)//水域
{
vis[i][j] = 0;
que.push({i,j});//使用多源 BFS
}
}
}
while(que.size())//安排高度
{
auto [x,y] = que.front();
que.pop();
for(int i = 0; i < 4; i++)
{
int a = x + dx[i];
int b = y + dy[i];
if(a >= 0 && b >= 0 && a < n && b < m && vis[a][b] == -1)
{
vis[a][b] = vis[x][y] + 1;
que.push({a,b});
}
}
}
return vis;
}
};