题目描述
分析
数学法
利用杨辉三角的生成公式,数值等于其两肩数值之和。即可求解
/**
* 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** generate(int numRows, int* returnSize, int** returnColumnSizes){
int **ret;
*returnColumnSizes = malloc(sizeof(int)*numRows);
ret = malloc(sizeof(int*)*numRows);
for(int i=0;i<numRows;i++){
ret[i] = malloc(sizeof(int)*(i+1));
(*returnColumnSizes)[i] = i+1;
ret[i][0] = 1;
ret[i][i] = 1;
for(int j = 1; j < i;j++){
ret[i][j] = ret[i-1][j-1]+ret[i-1][j];
}
}
*returnSize=numRows;
return ret;
}
收获
二级指针
通过本题对二级指针malloc操作的书写有了更准确的理解。
二维数组
一般在函数体内声明的二级指针(用来存储二维数组的),需要先将其申请行数个储存一级指针的空间
int **mat;
mat = malloc(sizeof(int *)*numRows);
再接着通过循环为每个指针申请储存空间
//假设每列的储存空间存放在数组columnSize中
for(int i = 0; i < numRows; i++){
mat[i] = malloc(sizeof(int)*columnSize[i]);
}
二级指针作为参数传入一级指针变量
指在caller函数中声明的一级指针变量,通过一个二级指针作为参数传入本函数中
本质上还是一个一维数组进行存储
一般在caller函数中后续有free()操作,因此需要通过malloc申请空间
#define retSize 10
void func(int **ret){
*ret = malloc(sizeof(int)*retSize);
}
可再通过一个循环赋值
for(int i = 0; i < retSize; i++){
(*ret)[i] = i; //将0,1,2,3……9,10存入ret数组中
}