leecode 59-螺旋矩阵Ⅱ
题目
给你一个正整数 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 循环
题目的要求是右–>下–>左–>上–>右这样的循环方式来填数,所以我们的思路也是如此,因为是个矩阵,所以是个二维数组,但是不适合用for循环,因为我们的螺旋方式的 i 和 j 都是有增有减,如果是用两个for循环来控制,比较麻烦。又因为要填的数字的个数是确定的,所以可以用一个 while 循环来操作。
所谓填数其实就是找位置,只要每次找到下一个要填数的位置即可,每填一个数,让待填的数字+1就行,直到填的数字累积到n^2。寻找位置的思路在代码的注释中给出来了,要注意的是从向上找到向右找的转换,只有当我们向上顶到头(也就是上一个位置被填过了,也就是不为0),才会向右找,所以需要设立一个标识符 id 来区分向上和向右。
以下是java实现的代码
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
matrix[0][0] = 1;//第一个位置永远是1
int id = 0;//设置标识符,0表示向右,1表示向上
int num = 2;//从2开始填
int i = 0;
int j = 1;
while(num<=n*n){//填够数就结束
matrix[i][j] = num++;//当前位置填数
//下面代码都是用来找下一个填数的位置
//向右:当右边还有位置,并且右边没有被填过时,向右移一个位置
if(j+1<n && matrix[i][j+1] == 0 && id == 0){
j++;
continue;
}
//向下:当下边还有位置,并且下边没有被填过时,向下移一个位置
if(i+1<n && matrix[i+1][j] == 0){
i++;
continue;
}
//向左:与上面类似,但是要注意标识符的更改
if(j-1>=0 && matrix[i][j-1] == 0){
j--;
id = 1;//修改id,准备开始向上找
continue;
}
//向上:少一个条件,因为向上不可能越界
//注意标识符,当上边的位置被填过时,才开始向右移动
if(matrix[i-1][j] == 0 && id==1){
i--;
if(matrix[i-1][j]!=0){
id = 0;//向上顶到头,修改id,开始向右找
}
continue;
}
}
return matrix;
}
}
标签:59,matrix,int,位置,矩阵,leecode,填数,向上,id
From: https://blog.csdn.net/qq_46440072/article/details/142393230