前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【杨辉三角】ArrayList和普通二维数组实现

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

作者头像
用户11288949
发布2024-09-24 13:38:43
480
发布2024-09-24 13:38:43
举报
文章被收录于专栏:学习

前言: 小编这里有两种方法实现,但是其中一种是要有泛型,以及ArrayList和List有所了解的uu哦

编码思路:

在编写代码时,我们应该熟悉杨辉三角的构造原理:

如图:

在第一列都为1,和每行最后一位也是1,中间部分数值则满足上一行对应数值前一列,和数值对应相同列。那么就有关键代码为:

代码语言:javascript
复制
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];

普通二维数组代码实现:

代码语言:javascript
复制
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本身底层就是一个数组;

代码语言:javascript
复制
List<Integer> ret=new ArrayList<>();

但是这种写法:

代码语言:javascript
复制
List<List<Integer>> row=new ArrayList<>();

表示的就是每个List里面又有一个List

所以这就是一个二维数组的形式

所以代码:

代码语言:javascript
复制
 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就能得到整个二维数组即杨辉三角;

完整代码:

代码语言:javascript
复制
 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提出宝贵意见。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编码思路:
  • 普通二维数组代码实现:
    • 代码讲解:
    • ArrayList代码实现:
      • 代码讲解:
      • 总结:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档