542.01矩阵
Posted szzla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了542.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
解题思路:
最开始的时候,我的思路是遍历所有的1,对于每个1,一层一层向外搜索,直至找到0,这样超时了。
看了大佬们的讲解,思路豁然开朗.
最开始的时候,我的思路是遍历所有的1,对于每个1,一层一层向外搜索,直至找到0,这样超时了。
看了大佬们的讲解,思路豁然开朗.
首先遍历matrix,对于非零点,设置一个较大值(row+col)
维护一个队列,首先将所有零点的坐标放入队列中
取出队列中的元素(i,j),搜索(i,j)的四个方向,如果某方向上的值大于或等于(matrix[i][j]+1),就将该方向的坐标值更新为matrix[i][j]+1,这是局部正确的。
然后将该方向的坐标加入队列
重复3-4步骤,直到队列为空。
维护一个队列,首先将所有零点的坐标放入队列中
取出队列中的元素(i,j),搜索(i,j)的四个方向,如果某方向上的值大于或等于(matrix[i][j]+1),就将该方向的坐标值更新为matrix[i][j]+1,这是局部正确的。
然后将该方向的坐标加入队列
重复3-4步骤,直到队列为空。
作者:ccdmw
链接:https://leetcode-cn.com/problems/01-matrix/solution/bfs-by-ccdmw-5/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/01-matrix/solution/bfs-by-ccdmw-5/
来源:力扣(LeetCode)
1 class Solution { 2 public int[][] updateMatrix(int[][] matrix) { 3 int row = matrix.length; 4 int col = matrix[0].length; 5 //灵活应对四个方向的变化 6 int[][] vector = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; 7 Queue<int[]> queue = new LinkedList<>(); 8 for (int i = 0; i < row; i++) { 9 for (int j = 0; j < col; j++) { 10 if (matrix[i][j] == 0) { 11 // 将所有 0 元素作为 BFS 第一层 12 queue.add(new int[]{i, j}); 13 } else { 14 //设一个最大值 15 matrix[i][j] = row + col; 16 } 17 } 18 } 19 while (!queue.isEmpty()) { 20 int[] s = queue.poll(); 21 // 搜索上下左右四个方向 22 for (int[] v : vector) { 23 int r = s[0] + v[0]; 24 int c = s[1] + v[1]; 25 if (r >= 0 && r < row && c >= 0 && c < col){ 26 if (matrix[r][c] >= matrix[s[0]][s[1]] + 1){ 27 matrix[r][c] = matrix[s[0]][s[1]] + 1; 28 queue.add(new int[]{r, c}); 29 } 30 } 31 } 32 } 33 return matrix; 34 } 35 }
以上是关于542.01矩阵的主要内容,如果未能解决你的问题,请参考以下文章