Java集合类ArrayList应用 | 二维数组的集合类表示与杨辉三角实现

news2025/1/13 17:28:59

目录

一、题干

🔗力扣:118. 杨辉三角

二、题解

1. 思路 

2. 完整代码

三、总结


一、题干

🔗力扣:118. 杨辉三角


二、题解

1. 思路 

我们知道杨辉三角的规律是:

  1. 每一行的第一列和它的最后一列上的数均为1.
  2. 除此之外,每个数是它的左上方与右上方的数之和。如果用 i 代表行, j 代表列,则有:

       [ i ][ j ] 等于 [ i-1 ][ j-1 ] + [ i-1 ][ j ]

本题的关键在于对ArrayList集合类的理解。在力扣上,该题的默认代码模板是这样的:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        ...
    }
}

因此,要完成这道题,我们需要先理清该函数的返回值 List<List<Integer>> 代表什么含义。

  • 从外层的List可以看出,有一个List集合类容器,且容器中的每个元素的数据类型仍是List。本文中我们采用ArrayList集合类实现,因此有以下示意图:

  •  而里层List中的元素类型是Integer,则有如下示意图:

由此可以看出, List<List<Integer>> 所代表的正是一个二维数组。用 i 表示横坐标(行),j 表示纵坐标(列),我们可以通过ArrayList中的get()方法获取二维数组 [i][j] 位置处的元素值。我们将步骤分解,得到具体操作如下: 

首先,我们需要创建出外层(即上图中左侧)的ArrayList,用ret表示:

List<List<Integer>> ret = new ArrayList<>();

ret中的每一个元素也是ArrayList类型。我们接下来要做的,就是依照规律逐行将杨辉三角中的数值放入“二维数组”中。第一行的1没有前一行或前一列,它是特殊的,需要单独先把1放进去:

//创建第一行
List<Integer> firstRow = new ArrayList<>();
//将第一行的元素1放入第一行的第一个
firstRow.add(1);
//将第一行作为ret的首元素加入ret中
ret.add(firstRow);

然后再插入剩下的数值。用for循环控制每行要完成的事,i 代表行数,由于第一行已经提前单独插入过数值,因此 i 从第二行开始,也就是下标为1处开始。

每一行,都创建一个ArrayList顺序表,用curRow表示。每一行的第一个元素和最后一个元素一定是1,直接通过curRow.add(1)插入即可。两个1中间部分的元素通过插入上方元素之和计算。可以新创建一个变量prevRow表示curRow的前一行:

List<Integer> prevRow = ret.get(i-1);
//获取元素并将结果插入curRow
curRow.add(prevRow.get(j-1) + prevRow.get(j));

也可以不用prevRow,直接插入:

curRow.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));

for循环的最后,还需要把当前行插入ret中。

ret.add(curRow);

示意图及合并代码如下:

        for (int i = 1; i < numRows; i++) {
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1);
            for (int j = 1; j < i; j++) {
                curRow.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));
            }
            curRow.add(1);
            ret.add(curRow);
        }

2. 完整代码

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();
        
        List<Integer> firstRow = new ArrayList<>();
        firstRow.add(1);
        ret.add(firstRow);
        for (int i = 1; i < numRows; i++) {
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1);
            for (int j = 1; j < i; j++) {
                curRow.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));
            }
            curRow.add(1);
            ret.add(curRow);
        }
        return ret;
    }
}

三、总结

  1. 杨辉三角的数值规律。
  2. Link<Link<Integer>>可以看作是一个二维数组,且该“二维数组”中的每个元素类型是Integer。分解来看即是一个ArrayList中的每个元素类型仍是一个ArrayList,且后者中的元素类型是Integer。

  3.  通过集合类的get方法获取元素。ret.get(i)指获取ret中第i个元素(ret中的元素类型仍是ArrayList,所以也就是获取第i行),ret.get(i).get(j)指获取行中第j个的元素。
  4. 关键的插入方法是,每一行都创建新的ArrayList对象curRow,先add顺序表curRow中的内容,最后再将该行作为ret的一个元素add到顺序表ret中。通过:

curRow.add(...);

ret.add(curRow);

即可搞定向该“二维数组”中插入元素。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在实验室服务器上跑代码

1.工具准备 可以下载一个xshell或secureCRT或者其他shell工具&#xff0c;通过ssh方式连接服务器&#xff0c;然后通过本地电脑终端控制服务器。连接方式输入主机&#xff08;Host&#xff09;,和端口号&#xff08;一般是22&#xff09;就行了。如下图 连接成功后就可以在本…

java面试题每日10问(1)

1.What is Java? Java is object-oriented, platform-independent, Multithreaded, and portable programming language.it provides its own JRE and API. 2.What is the difference between JDK, JRE, and JVM? JVM Java Virtual Machine provides the runtime environm…

返乡做县城跑腿平台困难吗?都有哪些需求要点需要掌握?

自2020年受疫情影响以来&#xff0c;大家对跑腿服务有了更全新的认识。跑腿的便利性和及时性让跑腿行业蓬勃发展。现如今全面开放之际&#xff0c;跑腿用户总数也将突破新高&#xff0c;其跑腿市场也将迎来快速发展期。 据统计&#xff0c;国内配送市场规模已超过400亿单&…

springmvc 请求转换为MultipartFile的过程

前言: 最近在研究文件上传的问题,所以就写下这个博客,让大家都知道从流转换为MutipartFile的过程,不然你就知道在方法中使用,而不知道是怎么样处理的,是不行的 从DiaspatherServlet说起: 别问为啥,去了解tomcat和servlet的关系,我后面会 写这篇博客的 servlet的生命周期 ini…

JVM内存结构简介

一、java代码编译执行过程 1.源码编译&#xff1a;通过Java源码编译器将Java代码编译成JVM字节码&#xff08;.class文件&#xff09; 2.类加载&#xff1a;通过ClassLoader及其子类来完成JVM的类加载 3.类执行&#xff1a;字节码被装入内存&#xff0c;进入JVM虚拟机&#xff…

Linux 计算机网络从零到一开始构建 必看

Linux 计算机网络从零到一开始构建 在整个互联网中&#xff0c;计算之间的沟可能通需要跨越千山万水&#xff0c;层层加密解码。当前我们就来尝试粗浅剖析一下整个计算机网络的形成。 形成与起源 从现在回头看之前的网络形成过程&#xff0c;其实对应的就是我们的网络多层架…

为了让自己心情愉悦,我用python把美妞得图片制成了GIF设置桌面

前言 大家早好、午好、晚好吖 ❤ ~ 要想生活过的去&#xff0c;每天美女必然少不了~ 每天看美女&#xff0c;只为了愉悦心情&#xff0c;心情好了&#xff0c;才长寿。 于是怀揣着愉悦心情的想法&#xff0c;我开始制作GIF动图生成器 这个小工具制作的目的是为了将多张图片组…

舵机的控制

舵机的信号线是做为输入线就是接收PWM信号&#xff08;定时器产生&#xff09;。 一般PWM的周期是20ms,那么对应的频率是50hz。那么改变不同的占空比就可以控制转动的角度。 其中占空比从0.5-2.5ms&#xff08;如果占空比大于2.5ms也只会在最大角度。&#xff09;&#xff0c;相…

Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端),界面高仿网易严选商城

下载地址&#xff1a;Node.jsMySQL开发的B2C商城系统源码数据库&#xff08;微信小程序端服务端&#xff09; NideShop商城&#xff08;微信小程序端&#xff09; 界面高仿网易严选商城(主要是2016年wap版)测试数据采集自网易严选商城功能和数据库参考ecshop服务端api基于&am…

php学习笔记-代码基本语法-day01

php代码基本语法 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&…

一些微信使用小技巧分享

技巧一&#xff1a;检测僵尸粉 微信好友过多&#xff0c;我们可以通过创建群聊来检测好友。点击右上角图标&#xff0c;选择【发起群聊】&#xff0c;勾选需要检测的好友&#xff0c;点击【完成】。能进群的都是朋友关系&#xff0c;不能进群的会删或者拉黑你。不过需要注意的是…

VS2022点云库PCL1.12配置过程中遇到的一些奇葩问题

最近处于换工作的间歇期&#xff0c;原来配置的电脑交公了&#xff0c;各种程序数据都做了搬家。对这些程序重新配置&#xff0c;可以说是一地鸡毛。系统对不上&#xff0c;各个开源库版本一团乱麻&#xff0c;尤其是配置PCL库的时候&#xff0c;遇到了各种奇奇怪怪的问题&…

二十八、Docker (4)

&#x1f33b;&#x1f33b; 目录一、Dockerfile入门1.1 Dockerfile 常用命令1.2 Dockerfile 搭建 jdk 环境1.3 Dockerfile 搭建 tomcat 环境镜像1.4 Dockerfile 创建微服务 java 镜像二、使用Nexus搭建Docker镜像私有仓库2.1 安装 Nexus2.2 访问配置 Nexus2.3 配置 Docker 服务…

自动驾驶助力智慧港口建设,景联文科技提供数据标注服务

“在无人集卡出现以前&#xff0c;岸桥式起重机需要把停靠在岸边的船舶上数百个集装箱全部吊起&#xff0c;放到一旁的集装箱卡车上&#xff0c;运向堆场&#xff0c;等待集装箱卸货后再进行下一次往返工作。为保证工作效率&#xff0c;需要上百位司机驾驶着集卡在港口中来回往…

拉伯证券|磷酸铁锂电池在储能市场的应用有哪些?

时隔四个月&#xff0c;中国有色金属工业协会硅业分会重启硅料报价。本周&#xff0c;单晶复投料成交均价为17.82万元/吨&#xff0c;单晶细密料成交均价为17.62万元/吨。综合其他组织报价数据&#xff0c;硅料已全线跌破20万元/吨&#xff0c;作为对比&#xff0c;上一年10月底…

Java入门知识以及细节(1.3w字笔记)

欢迎来到我的主页&#xff1a;【一只认真写代码的程序猿】 本篇文章收录于专栏【Java入门学习】 如果这篇文章对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 Java和C的区别 Java中的运算 Math.random()函数 跳出多重循环的两种break方法 数组中的使用以及Java中的…

windows下图像标注软件Labelme安装及使用教程

文章目录一.Labelme简介二.安装labelme三.使用labelme进行图像标注一.Labelme简介 LabelMe 是一个用于在线图像标注的Javascript标注工具。与传统图像标注工具相比&#xff0c;其优势在于我们可以在任意地方使用该工具。此外&#xff0c;它也可以帮助我们标注图像&#xff0c;…

TCP 三次握手 四次挥手

请描述TCP三次握手和四次挥手&#xff0c;这是非常常考的一道面试题。 大家不要去追求过多的细节&#xff0c;你如果是搜一些文章或者答案的话&#xff0c;它会给你描述的很细。 然后我/你看到会很懵&#xff0c;因为这里面如果讲细了的话&#xff0c;需要很多这种网络请求的相…

Go语言基础2

一、注释 单行注释 // 我是单行注释多行注释 /* 我是多行注释 我是多行注释 我是多行注释 */二、变量 1. var name type (声明变量时将变量的类型放在变量的名称之后) var&#xff0c;声明变量的关键字name&#xff0c;变量的名字type&#xff0c;变量的类型 eg:单个定义…

FFMPEG完美入门资料---003---FFmpeg 架构

3.1 FFmpeg 文件结构 libavformat 主要存放 ffmpeg 支持的 各种编解码器 的实现及 ffmpeg 编解码 功能相关的数 文件简要说明allcodecs.c简单的注册类函数avcodec.h编解码相关结构体定义和函数原型声明dsputil.c限幅数组初始化dsputil.h限幅数组声明imgconvert.c颜色空间转换相…