题目名称
Spiral Matrix II—LeetCode链接
描述
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
分析
先初始化一个n*n的二维向量,按从最外圈到最内圈的数序来将数字填进去,如图所示:
两层循环,外层循环表示对哪一圈进行处理,内层循环对所在圈的位置进行赋值。
int a=0,b=n-1,val=0;
while(a<b){
for(int i=0;i<(b-a);i++){
res[a][a+i]=++val;
res[a+i][b]=val+(b-a);
res[b][b-i]=val+2*(b-a);
res[b-i][a]=val+3*(b-a);
}
val = res[a+1][a];
a++;
b--;
}
考虑到n为奇数时,最内圈只有一个格子,上述循环会丢失最内圈一个元素的赋值,所以当n为奇数时,要增加一个判断:
if(n%2!=0){
res[n/2][n/2]=n*n;
}
C++代码
vector< vector<int> > generateMatrix(int n) {
vector< vector<int> > res;
if(n<=0)
return res;
vector<int> row(n,0);
res.insert(res.end(),n,row);
if(n==1){
res[0][0]=1;
return res;
}
int a=0,b=n-1,val=0;
while(a<b){
for(int i=0;i<(b-a);i++){
res[a][a+i]=++val;
res[a+i][b]=val+(b-a);
res[b][b-i]=val+2*(b-a);
res[b-i][a]=val+3*(b-a);
}
val = res[a+1][a];
a++;
b--;
}
if(n%2!=0){
res[n/2][n/2]=n*n;
}
return res;
}
总结
根据上一道题目对二维数组按照由外到内的每一圈进行处理,这也是对二维数组处理的一个经验。