一开始确实没有思路,一堆限制条件有点无从下手。
一圈一圈走,找到边界条件,左闭右开。
循环圈数就是N/2.
然后起始和结束位置也会变化。
奇数圈时要额外判断。
点击查看代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> v(n,vector<int>(n,0));
int startx=0,starty=0,offset=1,count=1;
int i=0;int j=0;
int turn=n/2;int mid=n/2;
while(turn){
i = startx;
j = starty;
for( j=starty;j<n-offset;j++){
v[i][j]=count++;
}
for(i=startx;i<n-offset;i++){
v[i][j]=count++;
}
for(;j>starty;j--){
v[i][j]=count++;
}
for(;i>startx;i--){
v[i][j]=count++;
}
++startx;++starty;++offset;
--turn;
}
if(n%2==1){v[mid][mid]=n*n;}
return v;
}
};
这样也可以
点击查看代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> v(n,vector<int>(n,0));
int startx=0,starty=0,offset=1,count=1;
int i=0;int j=0;
int turn=n/2;int mid=n/2;
while(turn){
for( j=starty;j<n-offset;j++){
v[startx][j]=count++;
}
for(i=startx;i<n-offset;i++){
v[i][j]=count++;
}
for(;j>starty;j--){
v[i][j]=count++;
}
for(;i>startx;i--){
v[i][j]=count++;
}
++startx;++starty;++offset;
--turn;
}
if(n%2==1){v[mid][mid]=n*n;}
return v;
}
};