今天来分享一下螺旋矩阵的解题思路及代码的实现。
题目描述如下:
首先拿到这道题,首先不要慌张,我们来仔细分析一下会发现并没有那么难。
首先看下边界的元素是1、2、3递增的,那么我们也许可以根据这一点先把边界的元素一个一个给加入到数组中。
具体思路如下:
我们看下面这个例子,我们创建一个4行4列的螺旋矩阵来进行分析
如果我们每次处理前3个数字,比如第一行我们处理1-3,然后继续处理列也就是4-6,然后处理7-9,这样可以发现一个规律就是我们每次都不对末尾的元素进行处理,这样遵循了循环不变原则。
然后处理完一圈之后一次对内部的13、14、15、16依次处理。
那么需要注意的是输入的n是奇数和偶数的处理还是有一定的区别。
完整的代码如下:
```java
public static int[][] generateMatrix(int n) {
int i=0;
int j=0;
int startx=0;
int starty=0;
int count=1;//用于1-16的赋值
int flag=1;
int[][] arr=new int[n][n];
int k=n;
while (k/2>0){//控制循环的次数
//处理第一行
for (j=starty;j<n-flag;j++){
//这里需要注意,行要为startx,如果行设置为i的话,
// 由于执行了第4个for循环后,i指向了0,那么在第一轮while循环没有问
//题,但是会影响2、3。。。次while循环的赋值
arr[startx][j]=count;//每次赋值完之后记得对count进行++
count++;
}
for (i=startx;i<n-flag;i++){
arr[i][j]=count;
count++;
}
for (j=n-flag;j>starty;j--){
arr[i][j]=count;
count++;
}
for (i=n-flag;i>startx;i--){
arr[i][j]=count;
count++;
}
k-=2;//每次循环后k-2
/**
* 当经过一次循环后,需要对startx、y、flag进行++,便于后续的while循环的赋值
*/
flag++;
startx++;
starty++;
}
//如果输入的n为奇数将中间的值进行赋值。
if (n%2!=0){
arr[startx][starty]=count;
}
return arr;
}
``
方便大家理解我花了下面这幅图
第一轮while循环执行的步骤,当执行完第一个for循环之后,j指向了红色箭头,然后执行第2个for循环对蓝色框进行赋值,然后i指向了蓝色箭头所示,,,后面的两个for循环分别对紫色和绿色矩阵进行赋值。
需要注意的几个点:
1.当经过一次循环后,需要对startx、y、flag
进行++,便于后续的while循环的赋值。
2. 每次while循环后需要进行-2或者/2的操作,但是不要操作传进来的n,需要用一个变量进行赋值,这样不会改变n的值,不会影响for循环的判断。
3. 还有就是对传入的n为奇数时的处理。
那么本道题的所有代码及思路就到这里结束了,如果有问题可以在文章下方留言,觉得博主写的不错的话麻烦点个小小的爱心。