螺旋矩阵着实花了点时间,想了好久才想明白,希望给小伙伴们带来点思路,觉得还不错得小伙伴可以点个赞哦~
题目描述
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
思路
螺旋矩阵解法是将矩阵分为四个块填入,如上图就是将1,2为一个模块,3,4为一个模块,5,6一个模块,7,8一个模块,四个模块即为一圈。主要就是一个循环停止的判断问题。
我们多分析几个矩阵可以找到如下规律
假设正整数为n,此时为第k圈
1.圈开始的横纵坐标为(k-1,k-1)
2.圈中每个模块的长度,即数字个数为n-k
3.将矩阵填完需运行n/2圈
4.如果n是奇数则矩阵中心元素[n/2][n/2为n^2
接下来就是代码啦
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> circle(n,vector<int>(n,0));
int loop=n/2; //圈数
int x=0; //初始横坐标
int y=0; //初始纵坐标
int num=1;
int i,j;
for(int c =1;c<=loop;c++){ //第c圈
i = x;
j = y;
for(j = y ;j<=n-c-1;j++) { //第一圈四分之一圈
circle[i][j] = num;
num++;
}
j = n - c;
for( i= x ;i<=n-c-1;i++) { //第一圈四分之二圈
circle[i][j] = num;
num++;
}
i = n - c;
for(;j>y;j--) { //第一圈四分之四圈
circle[i][j] = num;
num++;
}
j =y;
for(;i>x;i--) { //第一圈四分之三圈
circle[i][j] = num;
num++;
}
x++; //初始横坐标变化
y++; //初始纵坐标变化
}
if(n%2) {
circle[n/2][n/2] = num;
}
return circle;
}
};
要注意循环条件是小于等于哦~
还有每次圈开始的横纵坐标都要变化