• 矩阵中广度优先搜索的使用


    题目信息

    这道题是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;
        }
    }

    题目链接


  • 相关阅读:
    nginx解决前端跨域配置
    oracle 空表处理
    (转)Oracle修改表空间为自动扩展
    使用silverlight自定义控件时“给定关键字不在字典中”
    arcengine note:
    Jquery CSS 操作
    Jquery Easy-UI 树形菜单的运用
    Easy-UI data-options总结
    数据库 存储过程初探
    ASP.NET 日志的记录(登录日志和异常日志和操作日志)
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/12720173.html
Copyright © 2020-2023  润新知