前言:
小编这里有两种方法实现,但是其中一种是要有泛型,以及ArrayList和List有所了解的uu哦
编码思路:
在编写代码时,我们应该熟悉杨辉三角的构造原理:
如图:
在第一列都为1,和每行最后一位也是1,中间部分数值则满足上一行对应数值前一列,和数值对应相同列。那么就有关键代码为:
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
普通二维数组代码实现:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入杨辉三角的规格");
int range=sc.nextInt();
int[][] arr=new int[range][range];
arr[0][0]=1;
for (int i = 1; i <range ; i++) {
arr[i][0]=1;
for (int j = 1; j <=i ; j++) {
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
}
for (int row[]:arr){
for (int row2:row){
System.out.print(row2+" ");
}
System.out.println();
}
}
代码讲解:
1.首先我们先输入杨辉三角的规格,通过规格设定二维数组的大小
2.通过两组for循环,外循环为行,内循环为列,通过外循环将第一列全都都打印出来,内循环就从第二列开始执行。(防止在第一列数据在执行arr[i][j]=arr[i-1][j-1]+arr[i-1][j]时存在j-1,从而发生越界)
3.内循环执行核心逻辑代码arr[i][j]=arr[i-1][j-1]+arr[i-1][j],实现数值。
4.通过增强循环实现二维数组打印。
打印结果:
请输入杨辉三角的规格
5
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
ArrayList代码实现:
注意:实例化ArrayList本身底层就是一个数组;
List<Integer> ret=new ArrayList<>();
但是这种写法:
List<List<Integer>> row=new ArrayList<>();
表示的就是每个List里面又有一个List
所以这就是一个二维数组的形式
所以代码:
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> row=new ArrayList<>();
List<Integer> ret=new ArrayList<>();
row.add(ret);
ret.add(1);
for (int i=1;i<numRows;i++){
List<Integer> newRet=new ArrayList<>();
newRet.add(1);
List<Integer> oldRow=row.get(i-1);
for (int j = 1; j <i ; j++) {
int x=oldRow.get(j)+oldRow.get(j-1);
newRet.add(x);
}
newRet.add(1);
row.add(newRet);
}
return row;
}
代码讲解:
1. 首先定义一个返回类型为二维数组的List<List<Integer>>类,输入参数代表杨辉三角的规格;
2.通过实例化ArrayList定义一个二维,和一个一维的数组;
3.将第一行的ret给row,然后第一列为1;
4.通过每次循环,实例化一个ArrayList,并传给row,从而达到行数的增加;
例如:
row即是左边一列,每个地址代表一个一位数的行;
5.再循环内部每行的第一列都是1,并且上一行要通过row当前的对应的位置减去一返回前一个位置指定的一行一维数组;
6.调用上一行对应元素的j位置与j-1位置从而得到本行的元素;
7.将每行的信息传给row,最后通过调用输出row就能得到整个二维数组即杨辉三角;
完整代码:
public static void main(String[] args) {
Solution solution=new Solution();
Scanner sc=new Scanner(System.in);
int numRows=sc.nextInt();
List<List<Integer>> ret=solution.generate(numRows);
System.out.println(ret);
}
}
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> row=new ArrayList<>();
List<Integer> ret=new ArrayList<>();
row.add(ret);
ret.add(1);
for (int i=1;i<numRows;i++){
List<Integer> newRet=new ArrayList<>();
newRet.add(1);
List<Integer> oldRow=row.get(i-1);
for (int j = 1; j <i ; j++) {
int x=oldRow.get(j)+oldRow.get(j-1);
newRet.add(x);
}
newRet.add(1);
row.add(newRet);
}
return row;
}
总结:
小编认为第一种代码更好理解,第二种通过给定的ArrayList动态数组实现,是根据特殊要求下才编写的。题目来源. - 力扣(LeetCode)
限于小编能力有限,可能讲解不透彻,清晰,希望各位uu提出宝贵意见。
制作不易,麻烦给小编点个赞吧。