不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入: mat = [[0,0,0],[0,1,0],[0,0,0]]
输出: [[0,0,0],[0,1,0],[0,0,0]]
示例 2:
输入: mat = [[0,0,0],[0,1,0],[1,1,1]]
输出: [[0,0,0],[0,1,0],[1,2,1]]
思路
- 遍历原数组的0,放入目标数组,并放入队列 q
- 遍历队列 q,取出这个点,操作其上下左右四个方向
- 如果操作了,这个点放入 q
- 执行到结束
/**
* @param {number[][]} mat
* @return {number[][]}
*/
var updateMatrix = function (mat) {
let res = [];
let len = mat.length;
let lenx = mat[0].length;
function fn(y, x, t) {
// 上
if (y - 1 >= 0) {
if (res[y - 1][x] < 0) {
res[y - 1][x] = t + 1;
queue.push([y - 1, x]);
}
}
// 下
if (y + 1 <= len - 1) {
if (res[y + 1][x] < 0) {
res[y + 1][x] = t + 1;
queue.push([y + 1, x]);
}
}
// 左
if (x >= 1) {
if (res[y][x - 1] < 0) {
res[y][x - 1] = t + 1;
queue.push([y, x - 1]);
}
}
// 右
if (x + 1 <= lenx - 1) {
if (res[y][x + 1] < 0) {
res[y][x + 1] = t + 1;
queue.push([y, x + 1]);
}
}
}
let queue = [];
for (let a = 0; a < len; a++) {
res[a] = [];
for (let b = 0; b < lenx; b++) {
if (mat[a][b]) {
res[a][b] = -1;
} else {
res[a][b] = 0;
queue.push([a, b]);
}
}
}
while (queue.length) {
let [a, b] = queue.shift();
let value = res[a][b];
fn(a, b, value);
}
return res;
};