2022年7月4日leetcode每日一题打卡——118.杨辉三角

一、题目描述与要求

118. 杨辉三角 - 力扣(LeetCode)

题目描绘

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例

示例1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例2:

输入: numRows = 1
输出: [[1]]

提示

  • 1 <= numRows <= 30

二、解题思路

总的思路:

首先看到杨辉三角,首先应当想到的就是二维数组,因为杨辉三角中的每个数是它左上方和右上方的数的和。但是需要注意的是如果是二维数组的话出来的应当是一个正方形,但是部分空间并不存储数值,这就需要我们运用动态规划的思想。首先申请一个指针数组的二级指针ret,其实这个ret就相当于二维数组的名称,只不过其指向大小为numRows的指针数组,也就是指向每一行的首元素的数组。接着就是按照注释提示的将numRows赋给returnSize和returnColumnSizes,目的是为了最后返回的时候返回numRows个数组,每个数组里面以此存放i+1个元素。接着就是对这一二维数组进行赋值,首先为每一行申请对应i+1个存储空间用于存放数。returnColumnSizes是一个二级指针,它指向长度为numRows的整型数组,因此(returnColumnSizes)[i]指的就是每一行存储元素的个数,应当等于i+1,接着就是为每一行的第一个和最后一个都赋值为1,然后就是将每个元素的左上方和右上方的值加起来赋给它。如此一个杨辉三角就建立完成了。

注意的是,returnSize是整形指针,指向的是整型,只用于记录返回的行数,因此returnSize=numRows;而returnColumnSizes是二级指针,指向的是长度为numRows的整形数组,因此(*returnColumnSizes)[i]是为了表示每一行有多少个元素,与杨辉三角的建立是无关的,与最后的返回结果有关。

只有确定好返回数组的大小才不会导致空间的浪费。

具体步骤:

1、申请存储杨辉三角的存储空间
2、为返回数组个数以及数组中元素的个数进行赋值
3、对杨辉三角进行赋值
4、将每一行的第一个和最后一个数赋成1,剩下的为左上方和右上方的数的和,左上方是[i-1][j-1],右上方是[i-1][j]。
5、根据大小返回最后结果

三、具体代码

/**
 * Return an array of arrays of size *returnSize.//返回大小为*returnSize的数组
 * The sizes of the arrays are returned as *returnColumnSizes array.//数组的大小作为*returnColumnSizes数组返回
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
    //ret相当于一个二维数组,ret[i]指向的是第i行
    int** ret=malloc(sizeof(int*)*numRows);//ret为指向大小为numRows个整形指针数组的指针
    *returnSize=numRows;
    *returnColumnSizes=malloc(sizeof(int)*numRows);//指向大小为numRows的整型数组
    for(int i=0;i<numRows;i++)//二维数组赋值
    {
        ret[i]=malloc(sizeof(int)*(i+1));//申请空间,每一行的个数应当是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];//每个数等于它左上方也就是[i-1][j-1]的和右上方[i-1][j]的和
        }
    }
    return ret;
}

猜你喜欢

转载自blog.csdn.net/m0_59800431/article/details/125603408