Thursday, May 30, 2019

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 right.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Solution
{
    vector<vector<int>> dir;

public:
    vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
    {
        dir.push_back(vector<int>{-1, 0});
        dir.push_back(vector<int>{1, 0});
        dir.push_back(vector<int>{0, -1});
        dir.push_back(vector<int>{0, 1});
        int m = matrix.size(), n = matrix[0].size();
        queue<pair<int, int>> que;
        for (int i = 0; i < m; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if (matrix[i][j] == 0)
                    que.push(pair<int, int>(i, j));
                else
                    matrix[i][j] = INT_MAX;
            }
        }

        while (!que.empty())
        {
            int i = que.front().first, j = que.front().second;
            que.pop();
            for (auto d : dir)
            {
                int ii = i + d[0], jj = j + d[1];
                if (ii >= 0 && ii < m && jj >= 0 && jj < n && matrix[ii][jj] > matrix[i][j] + 1)
                {
                    matrix[ii][jj] = matrix[i][j] + 1;
                    que.push(pair<int, int>(ii, jj));
                }
            }
        }

        return matrix;
    }
};

No comments:

Post a Comment