class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ret(n,vector<int>(n , 0));
int left = 0;
int right = n-1;
int down =n-1;
int top =0;
int index =1;
while(index<=n*n){
if(left==right&&down==top){
ret[down][left]=index;
index++;
}
for(int i = left;i<right;i++,index++)
{
ret[top][i]=index;
}
for(int j=top; j<down;j++,index++){
ret[j][right] = index;
}
for(int i =right;i>left;i--,index++)
{
ret[down][i] = index;
}
for(int j =down;j>top;j--,index++ ){
ret[j][left]=index;
}
left++;
right--;
top++;
down--;
}
return ret;
}
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ret(n,vector<int>(n , 0));
int left = 0;
int right = n-1;
int down =n-1;
int top =0;
int index =1;
while(index<=n*n){
if(left==right&&down==top){
ret[down][left]=index;
index++;
}
for(int i = left;i<right;i++,index++)
{
ret[top][i]=index;
}
for(int j=top; j<down;j++,index++){
ret[j][right] = index;
}
for(int i =right;i>left;i--,index++)
{
ret[down][i] = index;
}
for(int j =down;j>top;j--,index++ ){
ret[j][left]=index;
}
left++;
right--;
top++;
down--;
}
return ret;
}
};
思路是:定四个坐标点
int left = 0;
int right = n-1;
int down =n-1;
int top =0;
和一个计数值:int index =1;,每次递增Index往矩阵中填入index
然后分别四次循环处理:从左上到右上;从右上到右下;。。。
关键点:每循环四次,四个坐标点往内部缩小一格
特殊处理:考虑n为奇数和偶数的不同情况。
n为偶数,能够通过四种基本for循环处理结束,即达到Index = n*n
n为奇数时,剩下最后一格出现:left==right&&down==top的情况,无法通过for处理
所以增加判断处理:
if(left==right&&down==top){
ret[down][left]=index;
index++;
}