zoukankan      html  css  js  c++  java
  • 矩阵中广度优先搜索的使用

    题目信息

    这道题是leetCode中的542题-01矩阵,
    题目大意是给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 
    输入
        [0 0 0]
        [0 1 0]
        [0 0 0]
    输出
        [0 0 0]
        [0 1 0]
        [0 0 0]
    
    输入
        [0 0 0]
        [0 1 0]
        [1 1 1]
    输出
        [0 0 0]
        [0 1 0]
        [1 2 1]
    注意:
        给定矩阵的元素个数不超过 10000。
        给定矩阵中至少有一个元素是 0。
        矩阵中的元素只在四个方向上相邻: 上、下、左、右

    解题思路

    这道题是典型的可以使用BFS去解决的,首页遍历数组将所有非0的赋值为-1,遍历的同时将为0的坐标保存到数组中。遍历之前保存0的数组的上下左右,在当前为0坐标的数据上加1,并且保存到数组中

    代码

    class matrixSolution {
        func matrix(_ matrix: [[Int]]) -> [[Int]] {
            var tempMatrix = matrix;
            var stack: [[Int]] = [];
            let rowNumber = matrix.count;
            let lineNumber = matrix[0].count;
            
            // 遍历备份的数组,将所有不为0的赋值为-1,将为0的坐标保存到另外一个数组
            for (i, list) in matrix.enumerated() {
                for (j, item) in list.enumerated() {
                    if (item == 0) {
                        stack.append([i, j]);
                    } else {
                        tempMatrix[i][j] = -1;
                    }
                }
            }
            
            // 这两个数组用于取值上下左右遍历
            let bx = [-1, 1, 0, 0];
            let by = [0, 0, -1, 1];
            
            // 遍历stack队列 知道为空时为止
            while !stack.isEmpty {
                let point = stack.first;
                stack.removeFirst();
                let x = point![0];
                let y = point![1];
                
                // 向周围四个方向遍历
                for ibx in 0..<4 {
                    let newX = x + bx[ibx];
                    let newY = y + by[ibx];
                    if newX >= 0 && newX < rowNumber && newY >= 0 && newY < lineNumber && tempMatrix[newX][newY] == -1 {
                        tempMatrix[newX][newY] = tempMatrix[x][y] + 1;
                        stack.append([newX, newY]);
                    }
                }
                
            }
            return tempMatrix;
        }
    }

    题目链接


  • 相关阅读:
    玩转oracle学习第五天
    硅谷科技巨头最刁钻面试题集锦
    Python模拟登录wap版百度贴吧+自己主动回贴
    Flask 源代码阅读笔记
    Spark1.0.0 生态圈一览
    listView.getChildAt(i)时java.lang.NullPointerException
    选择排序
    JNI 系统钩子
    MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写
    VVDocumenter
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/12720173.html
Copyright © 2011-2022 走看看