解法借鉴了 代码随想录 大佬的思路,采取左闭右开的原则,我没细看他们的代码,自己写了一下,他的方法是当n为奇数时,最后会出现一个位置没有被赋值。但我的做法是无论奇偶,最后一个位置都无法满足 row<offset 的条件,所以都需要针对最后一个位置在循环外进行赋值,算是还有缺陷?我打算等每个数据结构都刷上几题再回来二刷,到时有更好的做法再进行更新!
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
int row = 0;//列下标
int col = 0;//行下标
int number = 1;//填入的数
int circle = n/2;//循环执行次数,即圈数
int offset = 0;//每圈的偏移量
*returnSize = n;
(*returnColumnSizes)=(int*)malloc(sizeof(int)*n);
int **answer = (int*)malloc(sizeof(int*)*n);
for(int i=0;i<n;i++){
(*returnColumnSizes)[i] = n;
answer[i]=(int*)malloc(sizeof(int)*n);
}
while(circle>=0){
offset++;
circle--;
for(;col<n-offset;col++,number++){
answer[row][col]=number;
}
for(;row<n-offset;row++,number++){
answer[row][col]=number;
}
for(;col>offset-1;col--,number++){
answer[row][col]=number;
}
for(;row>offset;row--,number++){
answer[row][col]=number;
}
}
answer[row][col] = number;
return answer;
}