leetcode 118. 杨辉三角

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值