题目
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
一些感悟
其实这题没有什么特殊的技巧 一开始我做的时候我以为这样填 数字之间会有关联 后面发现就是按着顺时针的顺序进行填写数字 关键就是用代码没法很好的把顺时针的思路写出来 最一开始我想的是先走完第一行 然后按着三个三个走 两个两个走 一个一个走 就能走完 但是代码就写乱了 因为涉及的变量变化的太多
此题关键点
每次只遍历一条边 每条边的处理逻辑得相同 比如得留出一个元素以供下条边处理
一次循环 则完成一次顺时针 那么n为偶数的话就要n/2个顺时针的圈 可以把元素填完 n为奇数的话 也是n/2个顺时针的圈 但是会漏掉最中间的元素(这个直接所有圈数走完之后 再填写)
实现代码
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
*returnSize = n;
*returnColumnSizes = malloc(sizeof(int) * n);
int** result=(int **)malloc(sizeof(int *)*n);
for(int i=0;i<n;i++){
result[i]=(int *)malloc(sizeof(int)*n);
(*returnColumnSizes)[i] = n;
}
int startindex=0; //每一圈填充的起始位置
int ignore=1;//每填充一行或者一列会留ignore个元素给下一条边处理
int number=1,i,j;
// r为循环填充数字的圈数
for(int r=n/2;r>0;r--){
i=startindex,j=startindex;
//处理从左到右
for(;j<n-ignore;j++){
result[i][j]=number++;
}
//处理从上到下
for(;i<n-ignore;i++){
result[i][j]=number++;
}
//处理从右到左
for(;j>=ignore;j--){
result[i][j]=number++;
}
//处理从下到上
for(;i>=ignore;i--){
result[i][j]=number++;
}
startindex++;
ignore++;
}
if(n%2!=0){
result[n/2][n/2]=number;
}
return result;
}