leetcode 118. 杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
观察发现:
1、第 n 行(从 0 开始编号)的数字有 n+1 项
2、每行第一个数和最后一个数为1
3、每个数字等于上一行的左右两个数字之和,可用此性质写出整个杨辉三角。即第 n 行的第 i 个数等于第 n−1 行的第 i−1 个数和第 i 个数之和
生成杨辉三角示意图
#include <stdio.h>
#include <stdlib.h>
//生成杨辉三角,numRows为行数,returnSize为行的大小,returnColumnSizes为存储每行的列个数的数组
int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
//returnSize 行大小 returnColumnSizes 存储每行的列个数
int **ret=malloc(sizeof(int *)*numRows);
*returnSize=numRows;//行的大小
*returnColumnSizes=malloc(sizeof(int)*numRows);//存储每行的列个数
for(int i=0;i<numRows;i++)
{
ret[i]=malloc(sizeof(int)*(i+1));//每行有i+1个数(即列的个数)如0行1个数,1行2个数
(*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-1]+ret[i-1][j];//每个数字等于上一行的左右两个数字之和
}
return ret;
}
int main()
{
int numRows;
printf("Enter the number of numRows: \n");
scanf("%d",&numRows);
int returnSize;//接受返回的行的大小
int *returnColumnSizes;//接受每行的列的大小
int **ret=generate(numRows,&returnSize,&returnColumnSizes);
//输出结果
printf("The %d rows of Pascal's triangle are:\n",numRows);
for(int i=0;i<returnSize;i++)
{
for(int j=0;j<returnColumnSizes[i];j++)
printf("%d ",ret[i][j]);
printf("\n");
}
//释放内存
for(int i=0;i<returnSize;i++)
free(ret[i]);//释放每行的内存
free(ret);//释放整个返回的数组
free(returnColumnSizes);//释放每行的列的大小数组
return 0;
}