打印杨辉三角(时间、空间复杂度最低的方法)---java版

杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉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);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值