题目描述
给你一个正整数 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 <= n <= 20
思路
本题笔者使用模拟的方法来解决,通过代码模拟顺时针画矩阵的过程。时间复杂度为 O(n^2)。
代码
C++版:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n));
int x=1,count=1;
int i,j;
int s1=0,s2=0; // 起始点
int loop=n/2;
// 每个圈循环一次,共有n/2个圈
while(loop--){
i=s1;
j=s2;
for(j;j<n-x;j++){
result[i][j]=count++;
}
for(i;i<n-x;i++){
result[i][j]=count++;
}
for(;j>s2;j--){
result[i][j]=count++;
}
for(;i>s1;i--){
result[i][j]=count++;
}
s1++;
s2++;
x++;
}
// 当n为奇数时,需要单独处理中间的点
if(n%2==1) result[n/2][n/2]=count;
return result;
}
};
Python版:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
result=[[0]*n for _ in range(n)]
x=1
count=1
s1=0
s2=0
loop=n // 2
while loop!=0 :
for i in range(s2, n - x) :
result[s1][i] = count
count += 1
for i in range(s1, n - x) :
result[i][n-x] = count
count += 1
for i in range(n - x, s2, -1) :
result[n-x][i] = count
count += 1
for i in range(n - x, s1, -1) :
result[i][s2] = count
count += 1
s1+=1
s2+=1
x+=1
loop-=1
if n % 2 != 0 : # n为奇数时,填充中心点
result[n // 2][n // 2] = count
return result
需要注意的地方
1.在做螺旋矩阵这一类型题目的时候也要遵循循环不变量的原则,本题中的不变量:处理某一条边时从第一个节点开始处理,但是不处理最后一个节点。
2.当n为奇数时,中间的一点不能视作一圈,需要单独处理。