leetcode.542 01矩阵 广度优先搜索

leetcode 542. 01矩阵

原题链接

题目

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

两个相邻元素间的距离为 1 。

示例 1:
输入:

0 0 0
0 1 0
0 0 0

输出:

0 0 0
0 1 0
0 0 0

示例 2:
输入:

0 0 0
0 1 0
1 1 1

输出:

0 0 0
0 1 0
1 2 1

注意:

给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。

解题思路

广度优先搜索

因为矩阵只含0和1,所以1的邻居必定是0或1,要在01矩阵中找到1距离最近的0的距离,可以转换成每个0找到每个邻居1,再从邻居1找到非0邻居的1的求距离的问题。创建一个队列用于装坐标,对01矩阵进行一次遍历,把每个0点坐标入队,把每个1点坐标的值改为-1表示当前点1未被访问。将队列中的头结点出队,对于该头结点遍历其上下左右四个邻居,若邻居在边界内且未被访问过且不为0点(为-1),则将邻居的值改为当前结点值+1;改变了当前结点的邻居值后,把邻居也入队,直至队列为空时循环结束。

代码如下:

vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
    if(matrix.empty()) return matrix;
    int m=matrix.size();
    int n=matrix[0].size();
    deque<vector<int>> zero_deque;

    //初始化队列和01矩阵,将所有0坐标入队
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            //等于0,入队
            if(matrix[i][j]==0){
                vector<int> tmp={i,j};
                zero_deque.push_back(tmp);
            }
            //否则等于1改为-1,意义为未访问过
            else{
                matrix[i][j]=-1;
            }
        }
    }

    int dr[4]={-1,1,0,0};
    int dc[4]={0,0,-1,1};
    while(!zero_deque.empty()){
        vector<int> tmp=zero_deque.front();
        zero_deque.pop_front();
        int r=tmp[0];
        int c=tmp[1];
        //4个方向的邻居
        for(int i=0;i<4;i++){
            //邻居坐标
            int cur_r=r+dr[i];
            int cur_c=c+dc[i];
            //当前邻居在边界内且未被访问过
            if(cur_r>=0 && cur_r<m && cur_c>=0 && cur_c<n 
            &&matrix[cur_r][cur_c]==-1){
                matrix[cur_r][cur_c]=matrix[r][c]+1;
                vector<int> t={cur_r,cur_c};
                zero_deque.push_back(t);
            }
        }
    }
    return matrix;
}

看了题解好像也可以用动态规划,暂时没想到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值