题干:
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
思路:
杨辉三角的每一行的第一个数和最后一个都是1,第i行第j列个数res[i][j] = res[i - 1][j] + res[i - 1][j - 1];另外根据题目给出的注释部分,可以看出*returnSize是表示用来返回数组大小的一个数组,
*returnColumnSizes则是储存杨辉三角中的每一行元素的个数
源码:
/**
* 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){
*returnSize = numRows;
*returnColumnSizes = (int *)malloc(sizeof(int)*numRows); //储存杨辉三角每一行元素的个数
int** res = (int**)malloc(sizeof(int*)*numRows); //一个指向指针的指针* res指向每一行的指针** res表示整个数组
for(int i = 0; i < numRows; i++){
(*returnColumnSizes)[i] = i + 1; //杨辉三角中每一行中拥有多少个数据,第i行拥有i+1个数据(i从0开始算)
res[i] = (int*)malloc(sizeof(int)*(i + 1));
res[i][0] = 1;
res[i][i] = 1;
for(int j = 1; j < i; j++){
res[i][j] = res[i - 1][j] + res[i - 1][j - 1];
}
}
return res;
}
补充:
辅助理解int** res = (int**)malloc(sizeof(int*)*numRows); 可是作为int*(* res) 表示创建了一个列数为numRows的数组,这个数组中每个元素为一个指针。
指针数组:表示的是一个由指针变量组成的数组,也就是说其中的元素都是指针变量。
数组指针:表示的是这是个指向数组的指针,那么该指针变量存储的地址就必须是数组的首地址,得是个指向行的地址,如 a[2][3] 数组中的 a,a+1 等,不能是具体的指向列的地址,如 &a[0][1], &a[1][1] 这类地址。
链接:
参考链接:
https://www.runoob.com/cprogramming/c-array-of-pointers.html
https://blog.csdn.net/u012501459/article/details/45395571/
题目链接:
https://leetcode-cn.com/problems/pascals-triangle/comments/