题目:
思路:
首先想到的就是穷举遍历的方法了,不过穷举也有点规律。
我们以矩阵中的一个1为例,如下图,有颜色的的格子的数字表示距离,每一层也都是正方形,只不过这个正方形旋转了45°。
麻烦的地方在于数组下标的确定,对于每一层,可以先确定上下左右4个点,然后根据上点和下点确定其余的点。
假设当前点位置为: i i ,
对于每层
l
l
:
上:,
j
j
下:,
j
j
左:,
j−l
j
−
l
右:
i
i
,
再确定其余的点:
for (int m = 1; m <= l - 1; m++){
matrix[i - l + m][j - m];
matrix[i - l + m][j + m];
matrix[i + l - m][j - m];
matrix[i + l - m][j + m];
}
最后要注意避免数组越界问题。
Java代码:
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int rowNum = matrix.length;
int colNum = matrix[0].length;
int[][] resultMatrix = new int[rowNum][colNum];
for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
if (matrix[i][j] == 1) {
resultMatrix[i][j] = getNearest(i, j, matrix);
}
}
}
return resultMatrix;
}
private static int getNearest(int i, int j, int[][] matrix) {
int rowNum = matrix.length;
int colNum = matrix[0].length;
for (int l = 1; l <= rowNum * colNum; l++) {
int leftY = j - l;
int rightY = j + l;
int upX = i - l;
int downX = i + l;
if (leftY >= 0 && leftY <= colNum - 1 && matrix[i][leftY] == 0) {
return l;
}
if (rightY >= 0 && rightY <= colNum - 1 && matrix[i][rightY] == 0) {
return l;
}
if (upX >= 0 && upX <= rowNum - 1 && matrix[upX][j] == 0) {
return l;
}
if (downX >= 0 && downX <= rowNum - 1 && matrix[downX][j] == 0) {
return l;
}
for (int m = 1; m <= l - 1; m++) {
if (upX + m >= 0 && upX + m <= rowNum - 1 && j - m >= 0 && j - m <= colNum - 1 && matrix[upX + m][j - m] == 0) {
return l;
}
if (upX + m >= 0 && upX + m <= rowNum - 1 && j + m >= 0 && j + m <= colNum - 1 && matrix[upX + m][j + m] == 0) {
return l;
}
if (downX - m >= 0 && downX - m <= rowNum - 1 && j - m >= 0 && j - m <= colNum - 1 && matrix[downX - m][j - m] == 0) {
return l;
}
if (downX - m >= 0 && downX - m <= rowNum - 1 && j + m >= 0 && j + m <= colNum - 1 && matrix[downX - m][j + m] == 0) {
return l;
}
}
}
return 0;
}
}