[Leetcode] 542. 01 Matrix 解题报告

来源:互联网 发布:跆拳道泰拳知乎 编辑:程序博客网 时间:2024/05/05 11:30

题目

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 00 1 00 0 0
Output:
0 0 00 1 00 0 0

Example 2: 
Input:

0 0 00 1 01 1 1
Output:
0 0 00 1 01 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;    }};