【刷题启航!】只用一维数组完成杨辉三角的打印

一、题目描述

原题连接: BC109 杨辉三角
描述:
KiKi知道什么叫杨辉三角之后对杨辉三角产生了浓厚的兴趣,他想知道杨辉三角的前n行,请编程帮他解答。杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。
输入描述:
第一行包含一个整数数n。 (1≤n≤30)
输出描述:
包含n行,为杨辉三角的前n行,每个数输出域宽为5。

二、解题

1、方法1——二维数组

1.1、思路解析

因为要打印多行,而且我们也知道杨辉三角的第n行一定是能用第n - 1行算出来的,那我们首先想到的是用一个二维数组把每一行存起来,然后用上一行计算出下一行,然后打印,下面是图解过程:
在这里插入图片描述
这样做的好处是完成打印的同时也完成了对杨辉三角的存储,若是要求查询,也能够做到。

1.2、代码实现

void yangHuiTriangle1(int n) {
	int arr[30][30] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++) {
		for (j = 0; j <= i; j++) {
			if (0 == j || j == i) {
				arr[i][j] = 1;
			}
			else {
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
			}
			printf("%5d", arr[i][j]); // 存完一个打印一个
		}
		printf("\n"); // 打印完一行要记得换行
	}
}

时间复杂度:O(n^2)
空间复杂度:O(n^2)

2、方法2——一维数组

2.1、思路解析

有些人可能觉得用二维数组也有点太浪费空间了吧,而且这里只要求打印,那些数据存起来也没有什么实际意义啊,有没有更简单的方法。
当然有。
从上面我们也知道,打印的每一行都是需要通过上一行计算得来的,而且每一行用于计算下一行是是不是只是用了一次,那就代表使用了这一次之后就可以把这些数据丢弃了。
而且我们在中学就已经知道了杨辉三角有一个属性就是“对称性”:
在这里插入图片描述
这是不是说明我们在打印每一行的时候,正向打印和逆向打印得到的结果是一样的呢?
所以我们的思路就出来了:
我们可以想创建一个足够大的一维数组,讲第一个元素初始化为1,其他全为0:
在这里插入图片描述
然后第1行我们可以直接就打印一个1,我们从第二行开始算,我们计算每一行时,可以先从这一行的最后一个元素开始一值往前算,这样就能做到“上一行”数据只使用一次,且不会占用新的空间,例如我们计算第二行时:
在这里插入图片描述

2.2、代码实现

void yangHuiTriangle2(int n) {
	if (n < 1) {
		return;
	}
	int arr[31] = { 1 };
	printf("%5d\n", 1);
	int i = 0;
	int j = 0;
	for (i = 1; i < n; i++) {
		for (j = i; j > 0; j--) {
			arr[j] += arr[j - 1];
			printf("%5d", arr[j]);
		}
		printf("%5d", arr[0]); // 第一个数arr[0]是不变的,补上即可
		printf("\n");
	}
}

时间复杂度:O(n^2)
空间复杂度:O(n)

这是我的第一篇正式的题解,写的很拙劣,让大家见笑了。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林先生-1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值