所属专栏:脑筋急转弯❤️
>博主首页:初阳785❤️
>代码托管:chuyang785❤️
>感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
>博主也会更加的努力,创作出更优质的博文!!❤️
>关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️
由上面的图形分析规律我们可以发现,设行为i列为j,这明显是一个二维数组,当行=列或者列=0
的时候数据都是等于1的
,
而且arr[i][j]==arr[i - 1][j - 1] + arr[i - 1][j]
而且我么打印的时候并不是将每个数都打印出来,而是打印一半:
代码展示:
int main()
{
int n = 0;
scanf("%d", &n);
int arr[100][100] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j < n; j++)
{
if (i == j || j == 0)
arr[i][j] = 1;
else
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j <= i; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
return 0;
}
方法2:
我们会发现上述的代码的时间复杂度是n^2。 由于我在填第n行的杨辉三角时,只跟第n-1行的杨辉三角产生联系,不会跟之前的有联系,所以没必要保存每一行的杨辉三角,填一行打一行就行了,这样能让空间复杂度从n ^2降低到n。但是在填数据的时候不能对之前的数据覆盖,所以需要从后向前填。而填杨辉三角顺序对结果是没有影响的,所以可以实现。
于是我们就可以创建一个一维数组,同时把第一个数据初始化为1.
代码展示:
int main()
{
int n = 0;
scanf("%d", &n);
int data[30] = { 1 };
int i, j;
printf("1\n"); //第一行就直接打印了
for (i = 1; i < n; i++) //从第二行开始
{
for (j = i; j > 0; j--) //从后向前填,避免上一行的数据在使用前就被覆盖
{
data[j] += data[j - 1]; //公式同上,由于变成了一维,公式也变简单了。
}
for (j = 0; j <= i; j++) //这一行填完就直接打印了。
{
printf("%d ", data[j]);
}
putchar('\n');
}
return 0;
}