题目:
https://leetcode-cn.com/problems/spiral-matrix-ii/
题解:
这道题没有什么算法可言,分析整个过程,模拟即可。
我们用 i 表示横坐标,j 表示纵坐标,模拟上面过程:
1. 填充上行,从左到右,(i, j++)。
2. 填充右列,从上到下,(i++, j)。
3.填充下行,从右到左,(i, j--)。
4.填充左列,从下到上,(i--, j)。
注意:
1. 边界问题,步骤1结束后,需要转变填充方向,此时应该从4的位置开始填充(因为3已经填充过了)。
2.没有填充的位置一定是0,如果遍历到不为0的区域证明当前位置已经被填充,此时需要改变填充方向。
public int[][] generateMatrix(int n) {
int count = 1;
int i = 0;
int j = 0;
int[][] result = new int[n][n];
while (count <= n * n) {
// 向右
while (j < n && result[i][j] == 0) {
result[i][j] = count++;
j++;
}
i++;
j--;
// 向下
while (i < n && result[i][j] == 0) {
result[i][j] = count++;
i++;
}
j--;
i--;
// 向左
while (j >= 0 && result[i][j] == 0) {
result[i][j] = count++;
j--;
}
i--;
j++;
// 向上
while (i >= 0 && result[i][j] == 0) {
result[i][j] = count++;
i--;
}
j++;
i++;
}
return result;
}