keypoint:
主要确定循环的轮次,以及每次循环的边界和条件
n分为奇数和偶数,以n=3和n=4为例,n=3只需要循环最外面一圈,中间的格子单独填充;n=4,有两个圈,一个外圈一个内圈,那么每次循环n/2圈;循环时可以采用左闭右开,比如n=3的时候,第一次循环从左到右,起始是(0,0)–>(0,1),退出循环后j++,j=2,刚好作为下一个从上至下循环的起始,j不变i++
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {//初始化返回的结果数组的大小*returnSize = n;*returnColumnSizes = (int*)malloc(sizeof(int) * n);//初始化返回结果数组ansint** ans = (int**)malloc(sizeof(int*) * n);//旋转区间设定为左闭右开int startx=0,starty=0;int offset=1;int count=1;int i,j;for(i = 0; i < n; i++) {ans[i] = (int*)malloc(sizeof(int) * n);(*returnColumnSizes)[i] = n;}int loop=n/2;i=0,j=0;while(loop){//从左到右for(j=starty;j<n-offset;j++){ans[startx][j]=count++;}//从上到下for(i=startx;i<n-offset;i++){ans[i][j]=count++;}//从右到左for(;j>starty;j--){ans[i][j]=count++;}//从下到上for(;i>startx;i--){ans[i][j]=count++;}offset++;startx++;starty++;loop--;}//若n为奇数,单独填充中心点if(n%2!=0){ans[n/2][n/2]=n*n;}return ans;
}