🌈【LeetCode.距离顺序排列矩阵单元格】- JavaScript =>BFS+哈希

399 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题意描述

给出 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;
}

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤