Medium
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:
Input: [[0,0,0], [0,1,0], [0,0,0]] Output: [[0,0,0], [0,1,0], [0,0,0]]
Example 2:
Input: [[0,0,0], [0,1,0], [1,1,1]] Output: [[0,0,0], [0,1,0], [1,2,1]]
Note:
- The number of elements of the given matrix will not exceed 10,000.
- There are at least one 0 in the given matrix.
- The cells are adjacent in only four directions: up, down, left and right.
Accepted
46,846
Submissions
129,726
思路:
1 如果格子内元素本身是0, 不需要计算, 自己到自己的距离为0
2 如果格子内元素非0, 自然想到DP, 上下左右四个方向的元素,找出最小的, 再加1
3 由于格子是二维矩阵, 然而代码遍历是一维遍历. 所以需要遍历两遍. 左上+右下 或者 右上+左下 都可以. 想象一下 要是三维矩阵... 估计得遍历四次了... 再follow up N维矩阵怎么办...
class Solution { public int[][] updateMatrix(int[][] matrix) { if(null==matrix||matrix.length<1)return null; int width=matrix[0].length; int height=matrix.length; int [][]res=new int[height][width]; for(int j=0;j<height;++j) for(int i=0;i<width;++i) res[j][i]=Integer.MAX_VALUE-1; //这里有个坑点,如果不-1, 得到完全错误的结果. 因为底下的dp会+1, 就溢出变成负数....; 要么这里选择稍小的数字 for(int j=0;j<height;++j) for(int i=0;i<width;++i) { if(0==matrix[j][i]) res[j][i]=0; else { if(i>0) res[j][i]=Math.min(res[j][i], res[j][i-1]+1); if(j>0) res[j][i]=Math.min(res[j][i], res[j-1][i]+1); } } for(int j=height-1;j>=0;--j) for(int i=width-1;i>=0;--i) { if(0==matrix[j][i])res[j][i]=0; else { if(j<height-1) res[j][i]=Math.min(res[j][i], res[j+1][i]+1); if(i<width-1) res[j][i]=Math.min(res[j][i], res[j][i+1]+1); } } return res; } }