• [LeetCode]542. 01 Matrix


    Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.

    The distance between two adjacent cells is 1.

    Example 1: 
    Input:

    0 0 0
    0 1 0
    0 0 0
    

    Output:

    0 0 0
    0 1 0
    0 0 0
    

    Example 2: 
    Input:

    0 0 0
    0 1 0
    1 1 1
    

    Output:

    0 0 0
    0 1 0
    1 2 1
    

    Note:

    1. The number of elements of the given matrix will not exceed 10,000.
    2. There are at least one 0 in the given matrix.
    3. The cells are adjacent in only four directions: up, down, left and righ

    题目分析

      给一个由0和1组成的矩阵,求每一个元素到0元素的最近距离。

      考虑用BFS,用队列实现:

      1.将矩阵中为1的元素入队que,并设初始距离step=0

      2.若que不为空,循环:

        step = step +1

        遍历队列中的元素,这里用num计数实现,若在上下左右其中一个方向存在为0的元素:

          当前元素对应坐标的距离等于step,将元素入另一个队列delQue

           遍历队列delQue:

          取元素坐标(x,y),令matrix[x][y] =0;

      c++实现:

      

    class Solution {
    public:
        vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
            int m = matrix.size(),n = matrix[0].size();;
            int step = 0;
            int dx[4] = {0, 0, -1, 1};
            int dy[4] = {1, -1, 0, 0};
            vector<vector<int>> distance(m, vector<int>(n, 0));
            queue<pair<int, int>> que;
            for (int i=0; i<m;i++)
            {
                for (int j=0;j<n;j++) {
                    if (matrix[i][j] == 1) {
                        que.push(make_pair(i,j));
                    }
                }
            }
            int x, y, tmp_x, tmp_y;
            while(!que.empty()) {
                step ++;
                queue<pair<int, int>> delQue;
                //遍历queue
                int num = que.size();
                while (num--) {
                    x = que.front().first;
                    y = que.front().second;
                    //先删除元素
                    que.pop();
                    bool flag = true;
                    for (int i = 0;i < 4 ;i++) {
                        tmp_x = dx[i] + x;
                        tmp_y = dy[i] + y;
                        if(tmp_x >=0 && tmp_x <m && tmp_y >=0 && tmp_y < n && matrix[tmp_x][tmp_y] == 0) {
                            distance[x][y] = step;
                            delQue.push(make_pair(x,y));
                            flag = false;
                            break;
                        }
                    }
                    //周围没有为0元素,当前元素入队尾,进入下次que循环使用
                    if(flag) {
                        que.push(make_pair(x,y));
                    }
                }
                while(!delQue.empty()) {
                    matrix[delQue.front().first][delQue.front().second] = 0;
                    delQue.pop();
                }
            }
            return distance;
        }
    };
  • 相关阅读:
    第九节 堆栈的概念和python代码实现
    第八节 单向循环链表简单介绍和python代码实现
    第七节 双向链表简单介绍和python代码实现
    第六节 单链表简单介绍和python代码实现
    第五节 顺序表的原理与python中的list类型
    第四节 抽象数据类型
    第三节 Python列表类型性能测试以及内置字典操作的时间复杂度分析
    第二节 大O表示法和时间复杂度
    MySQL优化指南
    Java类加载机制详解
  • 原文地址:https://www.cnblogs.com/AndrewGhost/p/6754291.html
Copyright © 2020-2023  润新知