Bootstrap

【杨辉三角】ArrayList和普通二维数组实现

前言:

小编这里有两种方法实现,但是其中一种是要有泛型,以及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提出宝贵意见。

制作不易,麻烦给小编点个赞吧。

;