一、题意:
二、解题步骤
step1:初始化数组的大小、行数、列数、一维数组的大小
题目中参数说明:
returnColumnSizes
多见于存在二维矩阵的地方。
问:returnColumnSizes
是什么?
答:一个一维数组的地址的地址。(地址即指针,后同)
n
:矩阵阶数*returnSize
:矩阵行数**returnColumnSizes
每一行矩阵的元素个数(列数)
returnColumnSizes 是一维数组的地址的地址 * returnColumnSizes 是一维数组的地址 (* returnColumnSizes)[i] 是一维数组的i个元素
代码:
*returnSize=n; *returnColumnSizes=(int *)malloc(sizeof(int)*n); int **ans=(int **)malloc(sizeof(int*)*n);//动态数组开辟内存空间 for(int i=0;<n;i++){数组空间初始化 ans[i]=(int *)malloc(sizeof(int)*n); (*returnColumnSizes)[i]=n;//一维数组的大小 }
step2:设置转圈起始点、二维数组中间值、循环圈数、偏移数、需要添加值
NOTE:
偏移数:offset表示每一圈的每一条边的长度,用 startX+n-offset表示控制这个长度
需要添加值:每一个矩阵块的新添加值
//设置每次循环的起始位置 int startX = 0; int startY = 0; //设置二维数组的中间值,若n为奇数。需要最后在中间填入数字 int mid = n / 2; //循环圈数 int loop = n / 2; //偏移数 int offset = 1; //当前要添加的元素 int count = 1;
step3:画圈遵循循环不变量------“左闭右开”
- 从左到右填上行
- 从上到下填右行
- 从右到左填下行
- 从下到上填左行
左闭右开:
int i=startx; int j=starty; for(j=starty;j<starty+n-offset;j++){//从左到右填上行 左闭右开 ans[startx][j]=count++; } for(i=startx;i<startx+n-offset;i++){//从上到下填右行 左闭右开 ans[i][j]=count++; } for(;j>starty;j--){//从右到左填下行 左闭右开 ans[i][j]=count++; } for(;i>startx;i--){//从下到上填左行 左闭右开 ans[i][j]=count++; }
step4:临界值的改变
offset+=2; startx++; starty++; loop--; if(n%2!=0) ans[mid][mid]=count; return ans;
完整代码:
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ //初始化返回的结果数组的大小 *returnSize = n; *returnColumnSizes = (int*)malloc(sizeof(int) * n); //初始化返回结果数组ans int** ans = (int**)malloc(sizeof(int*) * n); int i; for(i = 0; i < n; i++) { ans[i] = (int*)malloc(sizeof(int) * n); (*returnColumnSizes)[i] = n; } //设置每次循环的起始位置 int startX = 0; int startY = 0; //设置二维数组的中间值,若n为奇数。需要最后在中间填入数字 int mid = n / 2; //循环圈数 int loop = n / 2; //偏移数 int offset = 1; //当前要添加的元素 int count = 1; while(loop) { int i = startX; int j = startY; //模拟上侧从左到右 for(; j < startY + n - offset; j++) { ans[i][j] = count++; } //模拟右侧从上到下 for(; i < startX + n - offset; i++) { ans[i][j] = count++; } //模拟下侧从右到左 for(; j > startY; j--) { ans[i][j] = count++; } //模拟左侧从下到上 for(; i > startX; i--) { ans[i][j] = count++; } //偏移值每次加2 offset+=2; //遍历起始位置每次+1 startX++; startY++; loop--; } //若n为奇数需要单独给矩阵中间赋值 if(n%2) ans[mid][mid] = count; return ans; }