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

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

  • 一、题目描述
  • 二、解题
    • 1、方法1——二维数组
      • 1.1、思路解析
      • 1.2、代码实现
    • 2、方法2——一维数组
      • 2.1、思路解析
      • 2.2、代码实现

一、题目描述

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

二、解题

1、方法1——二维数组

1.1、思路解析

因为要打印多行,而且我们也知道杨辉三角的第n行一定是能用第n - 1行算出来的,那我们首先想到的是用一个二维数组把每一行存起来,然后用上一行计算出下一行,然后打印,下面是图解过程:
【刷题启航!】只用一维数组完成杨辉三角的打印_第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、思路解析

有些人可能觉得用二维数组也有点太浪费空间了吧,而且这里只要求打印,那些数据存起来也没有什么实际意义啊,有没有更简单的方法。
当然有。
从上面我们也知道,打印的每一行都是需要通过上一行计算得来的,而且每一行用于计算下一行是是不是只是用了一次,那就代表使用了这一次之后就可以把这些数据丢弃了。
而且我们在中学就已经知道了杨辉三角有一个属性就是“对称性”:
【刷题启航!】只用一维数组完成杨辉三角的打印_第2张图片
这是不是说明我们在打印每一行的时候,正向打印和逆向打印得到的结果是一样的呢?
所以我们的思路就出来了:
我们可以想创建一个足够大的一维数组,讲第一个元素初始化为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)

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

你可能感兴趣的:(刷题之路——简单篇,算法,c语言)