算法笔记 -- 118. 杨辉三角

105 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

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

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

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

image.png

示例 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

二、思路分析:

没想到吧,这居然也是动态规划。动态规划就是多阶段决策模型,而我们的杨辉三角,就是先算一层,在算一层。

这里的状态转移方程就是res[i][j] = res[i-1][j] + res[i-1][j-1];

不过用C语言处理的问题就在于理解参数 int *returnSize, 我能理解,就是返回二维数组的行数 但是 **returnColumnSizes, 我就理解不能了, .解释上说 returnColumnSizes 用于确定数组的大小,那一个就够了呀,为啥给我两个。总之后续就按照它说的来吧。

三、AC 代码:

/**
 * 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){

    if (numRows == 0) {
        *returnSize = 0;
        return NULL;
    }
    
    //返回的行数
    *returnSize = numRows; //
    //返回的列数, 一个一维数组
    *returnColumnSizes =  (int *)malloc(sizeof(int) * numRows);
    //确定每行的大小
    for (int i = 0; i < numRows; i++){
         (*returnColumnSizes)[i] = i+1;  
    }

    //输出结果
    int **res = (int **)malloc(sizeof(int *) * numRows);
    //第一行
    res[0] = (int*)malloc(sizeof(int) );
    res[0][0] = 1;

    for (int i = 1; i < numRows; i++){
        res[i] = (int *)malloc(sizeof(int) * (i+1));
        for (int j = 0; j < (i+1); j++){
            if (j == 0 || j == i){
                res[i][j] = 1;
            } else{
                res[i][j] = res[i-1][j] + res[i-1][j-1];
            }
        }
    }
    return res;

}

范文参考

举例来找到对应关系:思路只有2句话,注释详细 - 杨辉三角 - 力扣(LeetCode)

小白也看的懂的C++ Python动态规划解法。 - 杨辉三角 - 力扣(LeetCode)