题目:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
public int[][] generateMatrix(int n){
//创建一个二维数组
int [][] res = new int[n][n];
//定义每循环一圈的起始位置
int startX =0,startY=0;
//每个圈循环几次,例如n为奇数3,那么loop=3/2=1,只是循环一圈,矩阵中间的只需要单独处理
int loop = n/2;
//矩阵中间的位置,例如:n为3,中间的位置就是[1,1];
int mid = n/2;
//用来给矩阵中每一个空格赋值
int count =1;
//每一圈循环,需要控制每一条边遍历的长度
int offset =1;
int i,j;
while(loop >0){
i = startX;
j = startY;
//下面开始的四个for就是模拟转一圈
//模拟填充上行从左到右(左闭右开)
for (j = startY; j <startY+n-offset ; j++) {
res[startX][j] = count++;
}
//模拟填充右列从上到下(左闭右开)
for (i = startX; i <startX+n-offset ; i++) {
res[i][j] = count++;
}
//模拟填充下行从右到左(左闭右开)
for (; j>startY;j--){
res[i][j] = count++;
}
//模拟填充左列从下到上(左闭右开)
for (; i>startX;i--){
res[i][j] = count++;
}
//第二圈开始的时候,起始位置要各自加1,
startX++;
startY++;
//offset控制每一圈里每一条边遍历的长度
offset+=2;
loop--;
}
//如果n为奇数,需要单独给矩阵最中间的位置赋值
if(n%2==1){
res[mid][mid] = count;
}
return res;
}
public static void main(String[] args) {
Luoxuanjuzhen luoxuanjuzhen = new Luoxuanjuzhen();
int [][]res = luoxuanjuzhen.generateMatrix(4);
for (int [] x:res) {
for (int y:x) {
System.out.print(y+" ");
}
}
}
输出结果:
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
时间复杂度:O(n)