118.Pascal’s Triangle(杨辉三角)
题目给我们一个整数numRows表示杨辉三角形的行数,返回杨辉三角形的前numRows行,下面给出一个杨辉三角形看看它有哪些规律;
可以看出杨辉三角形的每一行的最左侧和最右侧的值都为1.
其余的第i行的第j个元素p[i][j]可以由下图确定:
可以看出p[i][j] = p[i-1][j]+p[i-1][j-1],有了上述的思路我们可以写出代码如下:
int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
int **p = (int **)malloc(sizeof(int **)*numRows);
p[0] = (int *)malloc(sizeof(int*));
p[0][0] = 1;
*returnSize = numRows;
*returnColumnSizes = (int *)malloc(sizeof(int)*numRows);
(*returnColumnSizes)[0] = 1;
for(int i=1; i<numRows;i++){
(*returnColumnSizes)[i] = i+1;
p[i] = (int *)malloc(sizeof(int)*(i+1));
for(int j=0;j<=i;j++){
if(j-1<0){
p[i][j] = p[i-1][j]+0;
}else if(j>i-1){
p[i][j] = p[i-1][j-1]+0;
}else{
p[i][j] = p[i-1][j-1]+p[i-1][j];
}
}
}
return p;
}
运行结果截图:
119.Pascal’s Triangle II( 杨辉三角 II)
这道题要求返回杨辉三角形的第rowIndex行的值,杨辉三角形从第0行开始。有了上述的生成杨辉三角形的代码,我们只需要将杨辉三角的第i行的所有元素复制到x中,然后返回x即可,整体思路不变。
int* getRow(int rowIndex, int* returnSize) {
int **p = (int **)malloc(sizeof(int **)*(rowIndex+1));
int *x = (int *)malloc(sizeof(int)*(rowIndex+1));
p[0] = (int *)malloc(sizeof(int));
p[0][0] = 1;
*returnSize = rowIndex+1;
for(int i=1; i<=rowIndex;i++){
p[i] = (int *)malloc(sizeof(int)*(i+1));
for(int j=0;j<=i;j++){
if(j-1<0){
p[i][j] = p[i-1][j]+0;
}else if(j>i-1){
p[i][j] = p[i-1][j-1]+0;
}else{
p[i][j] = p[i-1][j-1]+p[i-1][j];
}
}
}
for(int i=0;i<rowIndex+1;i++){
x[i] = p[rowIndex][i];
}
return x;
}
运行结果截图:
这一道题也可以采用我在杨辉三角这篇文章中的思路,因为根据二项式定理,可以求出杨辉三角形每一行的值。