542. 01 Matrix

  • Difficulty: Medium

  • Topics: Depth-first Search, Breadth-first Search

  • Similar Questions:

Problem:

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.

Solutions:

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        if (m == 0) return {};
        int n = matrix[0].size();
        if (n == 0) return {};

        queue<pair<int, int>> q;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (matrix[i][j] == 0) {
                    q.push({i, j});
                }
            }
        }

        vector<vector<int>> ret(m, vector<int> (n, -1));

        int level = 0;
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                auto coord = q.front(); q.pop();
                int row = coord.first;
                int col = coord.second;
                if (row < 0 || row >= m || col < 0 || col >= n || ret[row][col] != -1)  continue;
                if (matrix[row][col] == 0) {
                    ret[row][col] = 0;
                } else {
                    ret[row][col] = level;
                }

                q.push({row + 1, col});
                q.push({row - 1, col});
                q.push({row, col + 1});
                q.push({row, col - 1});
            }

            ++level;

        }

        return ret;

    }
};

results matching ""

    No results matching ""