59.螺旋矩阵 II
描述
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
实例
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
题解
画一下示意图就可以知道,每条边长是有规律的
- 第一圈: ➡️n; ⬇️n-1; ⬅️n-1; ⬆️n-2;
- 第二圈: ➡️n-2; ⬇️n-3; ⬅️n-3; ⬆️n-4;
- 第三圈: ➡️n-4; ⬇️n-5; ⬅️n-5; ⬆️n-6;
- …
而且当n为奇数时,会在某一圈的➡️后结束,如果n为偶数时,会在某一圈的⬅️后结束,因此只要在完成这两个方向之后检查counter
的值是否超过了n^2
即可.
public static int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int counter = 1;
int flag = 1;//记录当前第几圈
int[] steps = new int[4];//记录这一圈中每个方向需要走几步
int x = -1;
int y = 0;
while (true){
steps[0] = n - 2*(flag-1);
steps[1] = steps[0] - 1;
steps[2] = steps[0] - 1;
steps[3] = steps[2] - 1;
for (int i = 0; i < steps[0]; i++) {
x++;
result[y][x] = counter;
counter++;
}
if (counter > Math.pow(n,2))
break;
for (int i = 0; i < steps[1]; i++) {
y++;
result[y][x] = counter;
counter++;
}
for (int i = 0; i < steps[2]; i++) {
x--;
result[y][x] = counter;
counter++;
}
if (counter > Math.pow(n,2))
break;
for (int i = 0; i < steps[3]; i++) {
y--;
result[y][x] = counter;
counter++;
}
flag++;
}
return result;
}