搜索
写经验 领红包

矩阵算法大全(《矩阵计算》)

导语:经典算法题:01 矩阵

一、题目

给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例 1: 输入:

0 0 00 1 00 0 0输出:

0 0 00 1 00 0 0示例 2: 输入:

0 0 00 1 01 1 1输出:

0 0 00 1 01 2 1

二、思路

元素0和自身的距离是0,元素1和0的距离等于0到1的距离。

用一个标记数组记录每个位置是否已经计算过距离。

初始化结果集和队列,遍历矩阵找到所有等于0的位置,结果集对应位置赋值0并且坐标入队。计算过距离的位置标记。

使用广搜,队列中元素出队后向四个方向分别搜索一次寻找1,如果搜索位置存在1则记录结果集距离为结果集中搜索源点的值+1,并且入队、标记。

三、实现

class Solution {

public int[][] updateMatrix(int[][] matrix) {

if (matrix == null || matrix.length == 0) {

return null;

}

int m = matrix.length;

int n = matrix[0].length;

int[][] res = new int[m][n];

boolean[][] visited = new boolean[m][n];

Queue<int[]> queue = new LinkedList<>();

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

if (matrix[i][j] == 0) {

res[i][j] = 0;

visited[i][j] = true;

queue.offer(new int[]{i, j});

}

}

}

int[][] direction = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};//上下左右

while (!queue.isEmpty()) {

int[] tmp = queue.poll();

int i = tmp[0];

int j = tmp[1];

for (int k = 0; k < 4; k++) {

int di = i + direction[k][0];

int dj = j + direction[k][1];

if (di >= 0 && di < m && dj >= 0 && dj < n && !visited[di][dj]) {

res[di][dj] = res[i][j] + 1;

visited[di][dj] = true;

queue.offer(new int[]{di, dj});

}

}

}

return res;

}

}

免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小若创作整理编辑!