「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。
螺旋矩阵
题目描述
给你一个正整数n,生成一个包含1到所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。
示例1:
输入:n=3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例2:
输入:n=1
输出:[[1]]
解析
题意分析
首先由这个给出的示例的3*3矩阵 我们来分析一下题意,
- 现在给定一个正整数3,生成一个1到9的螺旋排列的正方形矩阵,
- 第一行的三个数为1、2、3,起始位置为1,到3结束,
- 然后从3开始,第3列的三个数为3、4、5,到5结束,
- 之后5作为起始位置,第三行从右往左的三个数为5、6、7,到7结束,
- 之后7作为起始位置,然后向上只有一个位置,由数组8补上,
- 之后再转向中间的位置,才能最终形成螺旋排列的正方形矩阵,中间的位置就是最后一个正整数
思路延申
要画出这个螺旋排列的正方形矩阵,可以从上下左右四个角度分四步进行
- 从上行开始填入数字,从左到右
- 从右列开始填入数字,从上到下
- 从下行开始填入数字,从右到左
- 从左列开始填入数字,从下到上
以上操作完成时,如果是边长为奇数的矩阵中间还有空格,可填入最后一个正整数,如果是边长为偶数的矩阵中间,欸有空格,以上操作完成
代码
public int[][] generateMatrix(int n) {
//定义边长为n的二维数组
int [][] arr=new int[n][n];
//定义循环次数
int times=n/2;
//定义每次循环起始位置
int startX=0;
int startY=0;
//定义偏移量
int offset=1;
//定义填充数字,从1开始
int count=1;
//定义中间位置
int mid=n/2;
while(times>0){
//从上行开始填入数字,从左到右:1->2
for(int j=startY;j<startY+n-offset;++j){
arr[startX][j]=count++;
}
//从右列开始填入数字,从上到下:3->4
for(int i=startX;i<startX+n-offset;++i){
arr[i][j]=count++;
}
//从下行开始填入数字,从右到左:5->6
for(int j=startY;j>startY;j--){
arr[i][j]=count++;
}
//从左列开始填入数字,从下到上:7->8
for(int i=startX;i>startX;i--){
arr[i][j]=count++;
}
times--;
startX+=1;
startY+=1;
offset+=2;
}
//做判断,n为奇数的矩阵中间有一个空格,填入最后一个数字:9
if(n%2==1){
arr[mid][mid]=count;
}
//返回整个二维数组
return arr;
}