快速幂
多源bfs
// 多源bfs 每个格子的高度等于它到离它最近的水的距离
class Solution {
public int[][] highestPeak(int[][] isWater) {
int m = isWater.length, n = isWater[0].length;
Queue<int[]> q = new LinkedList();
int[][] d = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (isWater[i][j] == 1) {
d[i][j] = 0;
q.offer(new int[] {i, j}); // 从每个水域(一个源)开始搜索
} else d[i][j] = -1;
}
}
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1}; // 上,右,下,左
// 第i轮搜索到的点,距最近水源的距离即为i(水源为第0轮),也为上一轮搜到的距离+1
while (!q.isEmpty()) {
int[] t = q.poll();
for (int i = 0; i < 4; i++) {
int x = t[0] + dx[i], y = t[1] + dy[i];
if (x < 0 || x >= m || y < 0 || y >= n) continue;
if (d[x][y] == -1) {
d[x][y] = d[t[0]][t[1]] + 1;
q.offer(new int[] {x, y});
}
}
}
return d;
}
}