题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[ [1] ]
读题获取信息
n=4 时,如下图所示,正方形由 外圈 1-12 和 内圈 13-16 组成思路
综上可以想到
n = 3,转一圈,加一个数n = 4,转两圈n = 5,转两圈,加一个数n = 6,转三圈本题使用了左闭右开的形式
代码实现
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
if(n==1){
return new int[][]{{1}};
}
//赋的值
int count = 1;
//offset用于处理 圈数递增后 判断范围的相应改变
int offset = 1;
//x,y代表 每圈的起始位置
int x=0,y=0;
//p,q用于循环赋值指代 二维数据具体位置
int p=0,q=0;
//循环圈数
int loop = 0;
while(loop<n/2){
//处理圈数的第一部分,下面的循环依此类推
// n-offset 代表 右开,代入数字即很好理解
for( q=y; q<n-offset ;q++){
arr[x][q] = count++;
}
for(p=x;p<n-offset;p++){
arr[p][q] = count++;
}
//q > y也是如此,代表右开
for(;q>y;q--){
arr[p][q] = count++;
}
for(;p>x;p--){
arr[p][q] = count++;
}
//赋值完一圈之后,走下一圈
loop++;
//走一下圈,对应的 判断范围也需要相应修改
offset++;
//走一下圈,那么许愿起始位置也更换
x++;
y++;
}
//当n为奇数时,多出的一个数直接赋值即可,注意此处是xy,指向新的起始位置;
if(n%2==1){
arr[x][y] = count;
}
return arr;
}
}