LeetCode:01矩陣
阿新 • • 發佈:2019-02-05
題目如下:
給定一個由 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.矩陣中的元素只在四個方向上相鄰: 上、下、左、右。
思路:這道題使用廣度優先遍歷可以很快做出來,深度優先遍歷的話會出現超時等各種問題。。具體思路如下:
- 建立佇列,遍歷矩陣,將值為0的座標入列,值不為0的座標設定為MAX
- 遍歷佇列,檢視佇列中取出的座標四周是否有未被賦值的節點,壓入佇列
- 如果當前座標元素的值小於佇列遍歷的值,則賦值
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});
}
}
}