1. 程式人生 > >LeetCode:01矩陣

LeetCode:01矩陣

題目如下:

給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。

兩個相鄰元素間的距離為 1 。

示例 1:

輸入:

0 0 0
0 1 0
0 0 0

輸出:

0 0 0
0 1 0
0 0 0
示例 2:

輸入:

0 0 0
0 1 0
1 1 1

輸出:

0 0 0
0 1 0
1 2 1

注意:

1.給定矩陣的元素個數不超過 10000。
2.給定矩陣中至少有一個元素是 0。
3.矩陣中的元素只在四個方向上相鄰: 上、下、左、右。

思路:這道題使用廣度優先遍歷可以很快做出來,深度優先遍歷的話會出現超時等各種問題。。具體思路如下:

  1. 建立佇列,遍歷矩陣,將值為0的座標入列,值不為0的座標設定為MAX
  2. 遍歷佇列,檢視佇列中取出的座標四周是否有未被賦值的節點,壓入佇列
  3. 如果當前座標元素的值小於佇列遍歷的值,則賦值

AC程式碼如下:

class Solution {
    public int[][] updateMatrix(int[][] matrix) {
        if (null == matrix || matrix.length == 0 || null == matrix[0] || matrix[0].length == 0) {
            return matrix;
        }
        Queue<int[]> queue = new LinkedList<>();
        for
(int i = 0; i < matrix.length; i ++) { for (int j = 0; j < matrix[0].length; j ++) { if (matrix[i][j] == 0) { queue.offer(new int[]{i, j}); } else { matrix[i][j] = Integer.MAX_VALUE; } } } int
count = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i ++) { int[] point = queue.poll(); if (matrix[point[0]][point[1]] > count) { matrix[point[0]][point[1]] = count; } offerOther(matrix, point, queue); } count++; } return matrix; } private void offerOther(int[][] matrix, int[] point, Queue<int[]> queue) { int x = point[0], y = point[1]; if (x - 1 >= 0 && x - 1 < matrix.length && matrix[x - 1][y] == Integer.MAX_VALUE) { queue.offer(new int[]{x - 1, y}); } if (x + 1 >= 0 && x + 1 <matrix.length && matrix[x + 1][y] == Integer.MAX_VALUE) { queue.offer(new int[]{x + 1, y}); } if (y - 1 >= 0 && y - 1 <matrix[0].length && matrix[x][y - 1] == Integer.MAX_VALUE) { queue.offer(new int[]{x, y -1}); } if (y + 1 >= 0 && y + 1 < matrix[0].length && matrix[x][y + 1] == Integer.MAX_VALUE) { queue.offer(new int[]{x, y + 1}); } } }