目标
给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
说明:
1 <= n <= 20
思路
生成一个 n x n 的正方形矩阵,元素值 1 ~ n^2
按顺时针螺旋顺序排列。
定义 4
个方向,用 direction[i]
表示沿着 i
方向前进的坐标变化量。首先从 (0, 0) 开始向右遍历,预先计算下一步的坐标,如果越界或者已经设置过值则转向。这种解法需要标记已经设置过值的数组,由于填充的元素值都大于 0
,数组初值无需特殊处理,只需判断元素是否大于 0
即可。
代码
/**
* @date 2025-02-07 0:11
*/
public class GenerateMatrix59 {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int[][] direction = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int x = 0, y = 0, num = 1, d = 0;
for (int i = 0; i < n * n; i++) {
matrix[x][y] = num++;
int xNext = x + direction[d][0];
int yNext = y + direction[d][1];
if (xNext == n || yNext < 0 || yNext == n || matrix[xNext][yNext] != 0) {
d = (d + 1) % 4;
}
x += direction[d][0];
y += direction[d][1];
}
return matrix;
}
}