[Leetcode] 542. 01 Matrix 解题报告

本文介绍了解决矩阵中每个元素到最近0的距离问题的两种方法:深度优先搜索(DFS)和广度优先搜索(BFS)。通过这两种算法可以高效地计算出矩阵中每个位置到最近0的最小步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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 right.

思路

1、DFS:我们从每个值为0的格子开始进行DFS搜索,首先将当前格子的最近距离置为dist,然后朝四个方向进行搜索即可。需要注意的是,如果当前格子的值为0,那么需要将dist重置为0才可以。

2、BFS:用pair<int, int>来填充队列,其中第一个int标识格子所处的位置,第二个int标识当前格子距离0的最近距离。我们首先将所有0的位置的格子都加入队列中,然后依次处理队列中的每个元素。注意只有当ret[r][c] > dist的时候才需要更新ret[r][c]的值,并同时将其符合条件的邻居加入队列中,否则什么都不需要做。这样可以实现很有效的剪枝,大大提高效率。

代码

1、DFS:

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return {};
        }
        int row_num = matrix.size(), col_num = matrix[0].size();
        vector<vector<int>> ret(row_num, vector<int>(col_num, INT_MAX));
        for (int r = 0; r < row_num; ++r) {
            for (int c = 0; c < col_num; ++c) {
                if (matrix[r][c] == 0) {
                    DFS(matrix, ret, r, c, 0);
                }
            }
        }
        return ret;
    }
private:
    void DFS(vector<vector<int>> &matrix, vector<vector<int>> &ret, int row, int col, int dist) {
        int row_num = matrix.size(), col_num = matrix[0].size();
        if (row < 0 || row >= row_num || col < 0 || col >= col_num || ret[row][col] <= dist) {
            return;
        }
        if (matrix[row][col] == 0) {
            dist = 0;
        }
        ret[row][col] = dist;
        DFS(matrix, ret, row - 1, col, dist + 1);
        DFS(matrix, ret, row + 1, col, dist + 1);
        DFS(matrix, ret, row, col - 1, dist + 1);
        DFS(matrix, ret, row, col + 1, dist + 1);
    }
};

2、BFS:

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return {};
        }
        int row_num = matrix.size(), col_num = matrix[0].size();
        vector<vector<int>> ret(row_num, vector<int>(col_num, INT_MAX));
        queue<pair<int, int>> q;      // {r * col_num + c, dist}
        for (int r = 0; r < row_num; ++r) {
            for (int c = 0; c < col_num; ++c) {
                if (matrix[r][c] == 0) {
                    q.push(make_pair(r * col_num + c, 0));
                }
            }
        }
        while (!q.empty()) {
            pair<int, int> p = q.front();
            q.pop();
            int r = p.first / col_num, c = p.first % col_num, dist = p.second;
            if (ret[r][c] > dist) {
                ret[r][c] = dist;
                if (r - 1 >= 0 && matrix[r - 1][c] == 1 && ret[r - 1][c] > dist + 1) {
                    q.push(make_pair((r - 1) * col_num + c, dist + 1));
                }
                if (r + 1 < row_num && matrix[r + 1][c] == 1 && ret[r + 1][c] > dist + 1) {
                    q.push(make_pair((r + 1) * col_num + c, dist + 1));
                }
                if (c - 1 >= 0 && matrix[r][c - 1] == 1 && ret[r][c - 1] > dist + 1) {
                    q.push(make_pair(r * col_num + c - 1, dist + 1));
                }
                if (c + 1 < col_num && matrix[r][c + 1] == 1 && ret[r][c + 1] > dist + 1) {
                    q.push(make_pair(r * col_num + c + 1, dist + 1));
                }
            }
        }
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值