zoukankan      html  css  js  c++  java
  • Leetcode 542 01矩阵 图的按距离遍历

     

      按距离进行 BFS 即可,JAVA:

    int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    
        public final int[][] updateMatrix(int[][] matrix) {
            if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0][0];
            int xLen = matrix.length, yLen = matrix[0].length;
            Set<Long> set = new HashSet<Long>();
            Queue<int[]> queue = new LinkedList<int[]>();
            for (int i = 0; i < xLen; i++) {
                for (int j = 0; j < yLen; j++) {
                    if (matrix[i][j] == 0) {
                        queue.add(new int[]{i, j});
                        set.add(((long) i) << 32 | (long) j);
                    }
                    ;
                }
            }
            int currentNum = 1;
            while (queue.size() > 0) {
                int size = queue.size();
                for (int i = 0; i < size; i++) {
                    int[] current = queue.poll();
                    int x = current[0], y = current[1];
                    for (int j = 0; j < 4; j++) {
                        int dX = x + dir[j][0], dY = y + dir[j][1];
                        long key = ((long) dX) << 32 | (long) dY;
                        if (dX >= xLen || dX < 0 || dY >= yLen || dY < 0 || set.contains(key)) continue;
                        matrix[dX][dY] = currentNum;
                        queue.add(new int[]{dX, dY});
                        set.add(key);
                    }
                }
                currentNum++;
            }
            return matrix;
        }

      JS,在构造二维矩阵时要慎用 fill 方法,fill 方法中如果填充内容是对象,所有元素将指向同一对象:

    /**
     * @param {number[][]} matrix
     * @return {number[][]}
     */
    var updateMatrix = function (matrix) {
        if (!matrix || matrix.length == 0 || matrix[0].length == 0) return matrix;
        let dir = [[1, 0], [-1, 0], [0, 1], [0, -1]];
        let queue = [];
        let xLen = matrix.length, yLen = matrix[0].length;
        let his = new Array(xLen);
        for (let i = 0; i < xLen; i++) his[i] = new Array(yLen).fill(0);
        for (let i = 0; i < xLen; i++) {
            for (let j = 0; j < yLen; j++) {
                if (matrix[i][j] == 0) {
                    queue.push([i, j]);
                    his[i][j] = 1;
                }
            }
        }
        let currentNum = 1;
        while (queue.length > 0) {
            let currentLen = queue.length;
            for (let i = 0; i < currentLen; i++) {
                let currentNode = queue.shift();
                let x = currentNode[0], y = currentNode[1];
                for (let j = 0; j < 4; j++) {
                    let dX = x + dir[j][0], dY = y + dir[j][1];
                    if (dX < 0 || dX >= xLen || dY < 0 || dY >= yLen || his[dX][dY] == 1) continue;
                    matrix[dX][dY] = currentNum;
                    his[dX][dY] = 1;
                    queue.push([dX, dY]);
                }
            }
            currentNum++;
        }
        return matrix;
    }

    当你看清人们的真相,于是你知道了,你可以忍受孤独
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    让程序后台隐藏运行
    只要你喜欢,并且可以养家糊口,就是好的
  • 原文地址:https://www.cnblogs.com/niuyourou/p/13946590.html
Copyright © 2011-2022 走看看