「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)
示例 1:
输入:R = 1, C = 2, r0 = 0, c0 = 0 输出:[[0,0],[0,1]] 解释:从 (r0, c0) 到其他单元格的距离为:[0,1]
示例 2:
输入:R = 2, C = 2, r0 = 0, c0 = 1 输出:[[0,1],[0,0],[1,1],[1,0]] 解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2] [[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。
解法1:sort+哈希
分析:我们首先可以算出每个单元格到 [r0, c0] 的距离,然后将距离当作 key,单元格的值当作value,建立哈希表即 hash[distance].push([r, c])。再通过哈希去重过了,扁平化二维数组
var allCellsDistOrder = function(R, C, r0, c0) {
const res = [];
for(let i = 0; i < R; i++) {
for(let j = 0; j < C; j++) {
res.push([i,j]);
}
}
res.sort((a,b) => (Math.abs(a[0] - r0) + Math.abs(a[1] - c0) - Math.abs(b[0] - r0) - Math.abs(b[1] - c0)));
return res;
};
解法2:BFS
分析:我们创建出R行C列的二维数组,坐标用i和j来表示然后利用广度优先遍历
function allCellsDistOrder(R, C, r0, c0) {
let matrix= new Array(R*C).fill(0).map(v=>new Array(2).fill(0));//矩阵中所有的点
let visited= new Array(R).fill(0).map(v=>new Array(C).fill(false));//记忆化
const direction =[[-1,0],[1,0],[0,-1],[0,1] ] //方向
let index = 1; //matrix索引
let level = 0; //对matrix每个点探索周围
matrix[0] = [r0, c0];//最小的点是自身
visited[r0][c0] = true;
// 遍历所有点
while(index < R * C){
for(let i=0; i<4; i++){
let ri = matrix[level][0] + direction[i][0];
let ci = matrix[level][1] + direction[i][1];
if(ri >= 0 && ri < R && ci >= 0 && ci < C){
if(!visited[ri][ci] && index < R * C){
matrix[index] =[ri,ci];
visited[ri][ci] = true;
index++;//继续下一个
}
}
}
level++; //探索下一个点
}
return matrix;
}
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤