[LeetCode] 542、01 矩阵

题目描述

给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。

输入:

0 0 0
0 1 0
1 1 1

输出:

0 0 0
0 1 0
1 2 1

解题思路

看到找最短距离 => BFS

  • 广度优先搜索:(相似题目:[LeetCode] 1162、地图分析)
    • 首先把每个源点 0 0 0 入队,然后从各个 0 0 0 同时开始一圈一圈的向 1 1 1 扩散(每个 1 1 1 都是被离它最近的 0 0 0 扩散到的),扩散的时候可以设置 int[][] dist 来记录距离(即扩散的层次)并同时标志是否访问过。对于本题是可以直接修改原数组 int[][] matrix 来记录距离和标志是否访问的,这里要注意先把 matrix 数组中 1 的位置设置成 -1 (设成Integer.MAX_VALUE啦,m * n啦,10000啦都行,只要是个无效的距离值来标志这个位置的 1 没有被访问过就行辣~)
    • 复杂度分析:
      • 每个点入队出队一次,所以时间复杂度: O ( n ∗ m ) O(n * m) O(nm)
      • 虽然我们是直接原地修改的原输入数组来存储结果,但最差的情况下即全都是 0 0 0 时,需要把 m ∗ n m * n mn 0 0 0 都入队,因此空间复杂度是 O ( n ∗ m ) O(n * m) O(nm)

参考代码

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int rows = matrix.size();
        int cols = matrix[0].size();
        
        int dx[] = {0, 0, 1, -1};
        int dy[] = {1, -1, 0, 0};
        queue<int> q;
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if(matrix[i][j] == 0)
                    q.push(i*cols + j);
                else
                    matrix[i][j] = -1;
            }
        }
        
        int step = 1;
        while(!q.empty()){
            int sizeOfq = q.size();
            while(sizeOfq--){  // 这个while会保证遍历“一整圈”(自己理解)
                int tmp = q.front();
                q.pop();
                int row = tmp / cols;   // 小技巧,恢复坐标
                int col = tmp % cols;

                for(int i = 0; i < 4; i++){
                    int new_row = row + dx[i];
                    int new_col = col + dy[i];
                    if(new_row >= 0 && new_row < rows && new_col >= 0 && new_col < cols && matrix[new_row][new_col] == -1){
                        matrix[new_row][new_col] = step;  // bfs,必须在添加进queue的时候就进行着色,否则可能有重复遍历的问题!!(用 visited[] 数组时同理)
                        q.push(new_row * cols + new_col);  // 依旧用“i,j坐标封装”的小技巧
                    }
                }
            }
            
            if(!q.empty())
                step++;
        }
        
        return matrix;
    }
    
};

你可能感兴趣的:(算法(UVa,+,LeetCode,+,OJ,+,……))