一、什么是杨辉三角
杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。
通过观察我们可以返现,每行的第一个和最后一个元素都是1,中间的元素等于自己左上方和右上方两个元素之和。
二、用C语言实现一个简单的杨辉三角
#include <stdio.h>
// 计算组合数C(n, m)
int comb(int n, int m) {
if (m == 0 || m == n) {
return 1;
} else {
return comb(n-1, m-1) + comb(n-1, m);
}
}
// 打印杨辉三角
void printYangHuiTriangle(int numRows) {
for (int i = 0; i < numRows; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", comb(i, j));
}
printf("\n");
}
}
int main() {
int numRows;
printf("请输入要打印的行数:\n5");
scanf("%d", &numRows);
printYangHuiTriangle(numRows);
return 0;
}
三、LeetCode中的杨辉三角题
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目给定函数:
int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
}
其中上传的参数有numRows即为上传的行数。
*returnSize即返回到主函数的杨辉三角形行数
**returnColumnSizes即为返回到主函数的每一行的列数。
#include <stdio.h>
#include <stdlib.h>
int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
// 为结果分配内存空间
int** result = (int**)malloc(numRows * sizeof(int*));
*returnSize = numRows;
*returnColumnSizes = (int*)malloc(numRows * sizeof(int));
for (int i = 0; i < numRows; i++) {
// 为每一行分配内存
result[i] = (int*)malloc((i + 1) * sizeof(int));
(*returnColumnSizes)[i] = i + 1;//每行的列数
// 计算当前行的数值
result[i][0] = 1;
result[i][i] = 1;
for (int j = 1; j < i; j++) {
result[i][j] = result[i-1][j-1] + result[i-1][j];
}
}
return result;
}
int main() {
int numRows = 5; // 生成5行的杨辉三角
int returnSize;
int* returnColumnSizes;
int** result = generate(numRows, &returnSize, &returnColumnSizes);
// 打印生成的杨辉三角
for (int i = 0; i < returnSize; i++) {
for (int j = 0; j < returnColumnSizes[i]; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < returnSize; i++) {
free(result[i]);
}
free(result);
free(returnColumnSizes);
return 0;
}
需要注意的是函数中(*returnColumnSizes)[i] = i + 1;的意思是指向每行列数的地址,切不可写成returnColumnSizes[i]!