携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
一、题目描述:
118. 杨辉三角 - 力扣(LeetCode) (leetcode-cn.com)
给定一个非负整数 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
二、思路分析:
没想到吧,这居然也是动态规划。动态规划就是多阶段决策模型,而我们的杨辉三角,就是先算一层,在算一层。
这里的状态转移方程就是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;
}
范文参考: