版权声明::本文为博主原创文章,欢迎转载,博客地址: https://blog.csdn.net/u012535132/article/details/84111422
杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。
Description
1 第1行
1 1 第2行
1 2 1 第3行
1 3 3 1 第4行
1 4 6 4 1 第5行
............ 第n行
打印杨辉三角的办法有很多,例如:
- 利用一个二维数组,空间复杂度为O(n*n)
- 利用两个1维数组,第一个数组存储第i行的数,第二个数值存储第i+1行的数,反复迭代
本文将讲述用1个一维数值,打印杨辉三角。打印n行,只需要一个n+1个长度的一维数组。
方法:使用循环队列
算法步骤:
假设需要打印5行,目前状态是第4行(n=5 , i=4),接下来是更新第5行的流程:
1、初始位置,font指向最右边第一个1,数组的第0个位置;rear = font-1,既数组的第5个位置:
2、接下来,rear不动,font逐渐向前更新,a[0] = a[0]+a[1]:
a[font] = a[font]+a[font+1];font++
font逐渐前更新:
此时已达到边界的1了,停止更新:
3、接下来把rear位置设置为1,把最右边的1补上:
4、将font设置为rear+1,即font=rear+1,完成本次迭代:
代码:
import java.util.Scanner;
public class YangHui{
public static void Yanghui(int n) {
//边界条件判断
if(n<=0)return;
// 1 第一行
// 1 1 第二行
//---->第n行有n个数 , 多一个0,作为标记位
int a[] = new int[n+1];
a[0] = 1;//初始化第一个为1;
//定义两个指针,将数组看成一个循环数组
int rear = a.length-1;
int font = 0;
while(n>0) {
//打印第n行杨辉三角
printArray(a , rear , font);
// 0 4 6 4 1 0
// rear font
//当a[font]==1 && a[font+1]=0 就不向前进行累加了
while(a[font]!=1||a[(font+1)%a.length]!=0) {
a[font] = a[font]+a[(font+1)%a.length];//a[font] = a[font]+a[font+1];
font = (font+1)%a.length;//font++;
}
// 1 4 6 4 1 0
// rear font
a[rear] = 1;
// 1 4 6 4 1 0
// font rear
rear = (rear+a.length-1)%a.length;
// 1 4 6 4 1 0
// font rear
font = (rear+1)%a.length;
n--;
}
}
public static void printArray(int[] a , int rear , int font) {
while(a[font]!=0) {
//当碰到0时,打印结束,否则向前打印
System.out.print(a[font]+" ");
font=(font+1)%a.length;
}
System.out.println();
}
public static void main(String[] args) {
System.out.println("请输入要打印的行数:");
Scanner sc = new Scanner(System.in);
//输入要打印的行数
int n = sc.nextInt();
Yanghui(n);
}
}