Leetcode — 杨辉三角《超详解》
杨辉三角Ⅰ
分析: 1.杨辉三角的边界为1用代码表示 ret[i][0]=ret[i][i]=1; (定义ret一个二维数组,并需对其用malloc分配存储空间) 2.每个数字等于上一行的左右两个数字之和,代码表示 ret[i][j]=ret[i-1][j]+ret[i-1][j-1]。
int** generate(int numRows, int* returnSize, int** returnColumnSizes){ int **ret=malloc(sizeof(int*)*numRows); //malloc表示对内存大小的分配,这里是指给 ret分配了numRows大小的空间,以下同理 *returnSize=numRows; *returnColumnSizes=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]=ret[i][i]=1; //杨辉三角边界为1 for(int j=1;j<i;j++) { ret[i][j]=ret[i-1][j]+ret[i-1][j-1]; } }return ret; }
补充 <1>returnSize是指向一个整数的指针,表示返回杨辉三角的行数 = 输入numRows。 <2>returnColumnSizes是指向一个数组的指针,数组元素为对应行的元素个数。 <3>ret是一个指针,它指向的是由指针构成的数组,每个指针都指向对应的三角的一行数;ret也是二维数组。
杨辉三角Ⅱ
int* getRow(int rowIndex, int* returnSize) { *returnSize = rowIndex + 1; int* C[rowIndex + 1]; for (int i = 0; i <= rowIndex; ++i) { C[i] = malloc(sizeof(int) * (i + 1)); C[i][0] = C[i][i] = 1; for (int j = 1; j < i; ++j) { C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; } } return C[rowIndex]; }
如果可以理解杨辉三角Ⅰ,这道题也并没有难点了。理解以下这个即可以了
int* C[rowIndex + 1] 表示一个二维数组 可以写成 int**C,并且注意要分配空间大小 *C=malloc(sizeof(int)*rowIndex+1)。