一、思路
这道题感觉就是模拟过程,设置好拐点。
旋转顺序是按照map =【(0,1),(1,0),(0,-1),(-1,0)】的循环进行的,可以让数组按照这个map规律旋转,我们观察这个map可以发现,每一项的
d
i
d_i
di 都等于前一项的
d
j
d_j
dj,每一项的
d
j
d_j
dj都等于前一项的
−
d
i
-d_i
−di,所以可以简化一下代码。
二、代码
1.python
代码如下:
class Solution:
def generateMatrix(self, n) :
mat = [['-' for _ in range(n)] for _ in range(n)]
i,j,di,dj = 0,0,0,1
for k in range(n*n):
mat[i][j] = k+1
if mat[(i+di)%n][(j+dj)%n]!='-':
di,dj = dj,-di
i += di
j += dj
return mat
# for i in range(n):
# print(mat[i])
2.C++
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> mat(n,vector<int>(n,0));
int i=0,j=0,di=0,dj=1;
for(int k=0;k<n*n;k++){
mat[i][j] = k+1;
if( (i+di)>n-1 || (i+di)<0 ||(j+dj)>n-1 ||(j+dj)<0 ||mat[(i+di)%n][(j+dj)%n] != 0 ){
int temp = di;
di = dj;
dj = -temp;
}
i += di;
j += dj;
}
return mat;
}
};