1. 程式人生 > >[leetcode] 542. 01 Matrix (Medium)

[leetcode] 542. 01 Matrix (Medium)

給予一個矩陣,矩陣有1有0,計算每一個1到0需要走幾步,只能走上下左右。

解法一:

利用dp,從左上角遍歷一遍,再從右下角遍歷一遍,dp儲存當前位置到0的最短距離。

十分粗心的搞錯了col和row,改了半天…………

Runtime: 132 ms, faster than 98.88% of C++ online submissions for 01 Matrix.

class Solution
{
public:
  vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
  {
    
if (matrix.size() == 0 || matrix[0].size() == 0) return matrix; int n; int m; n = matrix.size(); m = matrix[0].size(); int rangeNum = n + m; vector<vector<int>> dis(n, vector<int>(m, 0)); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) {
if (matrix[i][j] == 0) dis[i][j] = 0; else { int up = (i > 0) ? dis[i - 1][j] : rangeNum; int left = (j > 0) ? dis[i][j - 1] : rangeNum; dis[i][j] = min(left, up) + 1; } } for (int i = n - 1; i >= 0; i--) for (int j = m - 1
; j >= 0; j--) { if (matrix[i][j] == 0) dis[i][j] = 0; else { int right = (j + 1) < m ? dis[i][j + 1] : rangeNum; int down = (i + 1) < n ? dis[i + 1][j] : rangeNum; dis[i][j] = min(min(right, down) + 1, dis[i][j]); } } return dis; } };

解法二:

BFS

class Solution
{
private:
  bool isValid(int m, int n, int x, int y)
  {
    return x >= 0 && y >= 0 && x < m && y < n;
  }

  int getShortestDistance(int m, int n, int x, int y, vector<vector<int>> &distance)
  {
    int result = distance[x][y];

    if (isValid(m, n, x, y + 1) && distance[x][y + 1] != INT_MAX)
    {
      result = min(result, 1 + distance[x][y + 1]);
    }
    if (isValid(m, n, x, y - 1) && distance[x][y - 1] != INT_MAX)
    {
      result = min(result, 1 + distance[x][y - 1]);
    }
    if (isValid(m, n, x + 1, y) && distance[x + 1][y] != INT_MAX)
    {
      result = min(result, 1 + distance[x + 1][y]);
    }
    if (isValid(m, n, x - 1, y) && distance[x - 1][y] != INT_MAX)
    {
      result = min(result, 1 + distance[x - 1][y]);
    }
    return result;
  }

public:
  vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
  {
    int m = matrix.size();
    int n = matrix[0].size();
    vector<vector<int>> distance(m, vector<int>(n, INT_MAX));
    queue<pair<int, int>> visit;

    for (int i = 0; i < m; i++)
    {
      for (int j = 0; j < n; j++)
      {
        if (matrix[i][j] == 0)
        {
          distance[i][j] = 0;
          visit.push(make_pair(i, j + 1));
          visit.push(make_pair(i, j - 1));
          visit.push(make_pair(i + 1, j));
          visit.push(make_pair(i - 1, j));
        }
      }
    }

    while (!visit.empty())
    {
      pair<int, int> cur = visit.front();
      visit.pop();
      int x = cur.first;
      int y = cur.second;

      if (isValid(m, n, x, y))
      {
        int shortestD = getShortestDistance(m, n, x, y, distance);
        if (shortestD < distance[x][y])
        {
          distance[x][y] = shortestD;
          visit.push(make_pair(x, y + 1));
          visit.push(make_pair(x, y - 1));
          visit.push(make_pair(x + 1, y));
          visit.push(make_pair(x - 1, y));
        }
      }
    }
    return distance;
  }
};