蓝桥杯---杨辉三角(java)

该博客讨论了一种使用队列实现杨辉三角的算法,并通过Java代码展示其过程。作者指出,在处理大数量级(如10^9)的数时,需要考虑层数限制以避免内存溢出。博客提出了对于寻找特定数值在杨辉三角中的位置以及如何确定所需层数的疑问。

H1

 解题思路:杨辉三角可以用队列(list)来做,杨辉三角从第一行开始就是没两个相邻数相加得到下面的一个数,其中的1可以看做是0+1得来的,所以第一行可以设为list1=(0,1,0),设一个队列头=0,每次从list1集合里面取出一个,加上队列头,然后存入list2队列中,再将取出来的值设为队列头。遍历完后,就在list2里面加上一个0,因为上一行最后一个数是没有的,再将这个队列赋值给list1以此下去,将list2里面的值都放到list3中。

这是在B站看到的

实现代码:

package 蓝桥杯;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import 编程练习题.foreach语句;

public class 杨辉三角 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		long N=scanner.nextLong();
		//list1用来存放用来生成下一行数字的层
		List<Long> list1=new ArrayList<>();
		//list2用来存放生成的层
		List<Long> list2=new ArrayList<>();
		//list3是用来存放所有的层
		List<Long> list3=new ArrayList<>();
		//list4用来找N所在位置的
		List<Long> list4=new ArrayList<>();
		//初始化第一行
		list1.add(0L);list1.add(1L);list1.add(0L);
		//将第一层放list3里面去
		list3.addAll(list1);
		//设置队列头
		long pre=0;
		//设置循环的次数(杨辉三角的层数),具体多少层,这是个坑,后面会说
		for (int i = 0; i < 40; i++) {
			while (list1.size()!=0) {
				//每次从队列取出第一个数据
				long now=list1.remove(0);
				//将pre和now的和加入list2,作为下一行的值
				list2.add(pre+now);
				//然后将now作为队列头
				pre=now;
			}
			//此时list2后面是缺少一个0的,我们加上
			list2.add( 0L);
			
			//将list2的值放到list3中去
			list3.addAll(list2);
			
			//将list1中的数据清掉,用来存放list2,进行下一轮的遍历
			list1.clear();
			list1.addAll(list2);
			list2.clear();
			
			
			
		}
		//遍历list3,将不是零 的值加到list4里面
		
		for(long l:list3) {
			if (l!=0) {
				list4.add(l);
			}
		}
		for(long l:list4) {
			System.out.println(l);
		}
		//从list中找出N的位置
		System.out.println(list4.indexOf(N)+1);
		
	}

}

要是杨辉三角中的数N不存在的话,就会返回0,题目他不是指最大数达到1000000000就可以了,而是到底要多少层,才会有1000000000内的所有数字,要是层数太大的话,内存就会超限。

这就是我不懂的地方,

所以在这里请教一下大家

<think>好的,我现在需要处理用户关于蓝桥杯竞赛中Java实现杨辉三角的问题。首先,用户希望找到相关的题目、解题思路和代码示例。我需要回忆蓝桥杯历届试题,特别是涉及杨辉三角Java题目。 根据提供的引用,特别是引用[2]提到“算法 — 杨辉三角形”并指出代码存在冗余但能通过测评系统,这可能是一个直接的例子。引用[3]是第八届蓝桥杯Java C组省赛真题,虽然题目1是关于星期几的计算,但可能其他题目涉及杨辉三角,但用户引用的内容中没有明确提到。需要确认是否有其他年份的题目。 用户可能需要具体的代码实现。杨辉三角的常规解法有迭代和递归两种。递归方法可能效率不高,但对于小规模数据可行。迭代方法更常用,尤其是考虑到蓝桥杯对性能的要求。引用[1]提到递归解决杨辉三角问题,但用户可能需要更高效的迭代方法。 接下来,我需要构建一个Java杨辉三角生成代码示例。通常,使用二维数组来存储每一行的元素,每个元素是上一行相邻两个元素之和。需要注意数组的索引和边界条件,比如每行的第一个和最后一个元素都是1。 解题思路部分应分步骤说明,包括初始化二维数组、填充数组的循环结构以及处理每行的元素关系。同时,需要指出可能的优化点,比如减少冗余计算,或者仅保存当前行和上一行以节省空间。 可能的相关问题包括优化方法、不同解法的时间复杂度分析,以及杨辉三角的应用场景。需要确保回答的结构清晰,符合用户要求的格式,包括行内LaTeX公式的正确使用和独立公式的格式。 最后,检查引用标记是否正确添加,特别是引用[2]提到了算法实现,而引用[3]可能涉及具体的竞赛题目,但需要确认是否相关。用户的问题主要集中在杨辉三角的实现,因此重点放在引用[1]和[2]上。</think>### 蓝桥杯 Java 杨辉三角实现详解 #### 一、问题背景 杨辉三角蓝桥杯竞赛中常见的算法题,要求生成特定行数的杨辉三角或返回第 $k$ 行的内容。例如,输入行数 $n=5$,需输出如下形式: $$1$$ $$1\quad1$$ $$1\quad2\quad1$$ $$1\quad3\quad3\quad1$$ $$1\quad4\quad6\quad4\quad1$$ #### 二、实现思路(迭代法) 1. **初始化二维数组**:使用二维数组 `dp[n][n]` 存储三角数据 2. **填充边界值**:每行首尾元素为 $1$ 3. **递推关系**:中间元素满足 $dp[i][j] = dp[i-1][j-1] + dp[i-1][j]$ 4. **输出格式**:控制空格对齐(根据题目具体要求调整) #### 三、Java 代码示例 ```java public class YangHuiTriangle { public static void main(String[] args) { int n = 5; // 输入行数 int[][] dp = new int[n][n]; for (int i = 0; i < n; i++) { // 填充首尾元素 dp[i][0] = 1; dp[i][i] = 1; // 计算中间元素 for (int j = 1; j < i; j++) { dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; } // 输出当前行 for (int j = 0; j <= i; j++) { System.out.print(dp[i][j] + " "); } System.out.println(); } } } ``` #### 四、优化方向 1. **空间优化**:仅用一维数组存储当前行,逐步覆盖(空间复杂度从 $O(n^2)$ 降至 $O(n)$)[^2] 2. **减少冗余计算**:对称性质可利用,仅计算左半部分 3. **递归实现**:如引用[1]提到的递归方式(但效率较低,适合小规模数据)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值