【Java题解】杨辉三角—力扣

🎉欢迎大家收看,请多多支持🌹

🥰关注小哇,和我一起成长🚀个人主页🚀

⭐目前主更 专栏Java ⭐数据结构

⭐已更专栏有C语言计算机网络


题目链接:杨辉三角

目录👑

⭐题目描述:

🌙大体分析:

🔆题目代码及详解


⭐题目描述:

🌙大体分析:

我们可以看到题中要求我们用列表来写这个题,

List<List<Integer>>是一个嵌套列表,列表里面存放的也是列表,且存放的列表里面存放的是Integer类型的对象。这类似与一个二维数组。

所以我们可以先创建一个嵌套列表对象,由于第一行始终只有一个数字1,我们可以先添加进去:

java 复制代码
       List<List<Integer>> list = new ArrayList<>();
       List<Integer> list1 = new ArrayList<>();
       list1.add(1);
       list.add(list1);

现在画图来分析一下

我们可以看到每一行的首位数字都是1,而这之间的数字都是由上一行的同列数字加上前一个数字。

比如,图中红色的3由上一行同列的2和2的前一个数字1相加得来。

因此我们可以利用循环来将每一行中间的数字用上面的方法算出来,我们要注意,是只有每一行除了首尾的数字才这样计算,所以注意循环的判断条件和初始值。

java 复制代码
           for(int i = 1; i < numRows;i++){
           //每一行的开始
           List<Integer> temp = new ArrayList<>();
           temp.add(1);
           //每一行中间
           List<Integer> prerow = list.get(i-1);//当前行的前一行
           for(int j = 1; j < i; j++){
               int val1 = prerow.get(j);
               int val2 = prerow.get(j - 1);
               int value = val1 + val2;
               temp.add(value);
           }
           //每一行末尾
           temp.add(1);
           list.add(temp);
       }

每一行先创建一个列表对象,先将1添加进去,然后循环添加中间数字,再添加末尾的1。

每一行列表的数字添加好后,记得还要将这个列表添加进外层列表。

🔆题目代码及详解

该题总的代码:

java 复制代码
class Solution {
    public List<List<Integer>> generate(int numRows) {
       List<List<Integer>> list = new ArrayList<>();
        if(numRows <= 0){
            return list;
        }
       List<Integer> list1 = new ArrayList<>();
       list1.add(1);
       list.add(list1);
       for(int i = 1; i < numRows; i++){
        //每一行的开始
        List<Integer> temp = new ArrayList<>();
        temp.add(1);
        //每一行中间
        List<Integer> preRow = list.get(i-1);//当前行的上一行
        for(int j = 1; j < i; j++){
            int val1 = preRow.get(j);
            int val2 = preRow.get(j - 1);
            int value = val1 + val2;
            temp.add(value);
        }
        //每一行的末尾
        temp.add(1);
        list.add(temp);
       }
        return list;
    }
}

首先,我们创建了一个List<List<Integer>>类型的list来存储整个杨辉三角。然后,我们检查numRows是否小于或等于0,如果是,则直接返回一个空的list。

杨辉三角的第一行总是只有一个1,我们将其作为一个List<Integer>添加到list列表中。

从第二行开始,我们逐行生成杨辉三角的每一行,我们需要先获取当前行的上一行preRow,进而才能得到上一行的第 j 列和第 j - 1列的值。

中间元素添加完后再进行尾部元素1的添加。

再将创建好的每一行temp列表添加到list中,然后返回。

这里再补充一个更完整的代码,能在IDEA中打印出列表看到效果:

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
    public List<List<Integer>> generate(int numRows) {
       List<List<Integer>> list = new ArrayList<>();
        if(numRows <= 0){
            return list;
        }
       List<Integer> list1 = new ArrayList<>();
       list1.add(1);
       list.add(list1);
       for(int i = 1; i < numRows;i++){
           //每一行的开始
           List<Integer> temp = new ArrayList<>();
           temp.add(1);
           //每一行中间
           List<Integer> prerow = list.get(i-1);//当前行的前一行
           for(int j = 1; j < i; j++){
               int val1 = prerow.get(j);
               int val2 = prerow.get(j - 1);
               int value = val1 + val2;
               temp.add(value);
           }
           //每一行末尾
           temp.add(1);
           list.add(temp);
       }
       return list;
    }

    public static void main(String[] args) {
        Test test = new Test();
        Scanner in = new Scanner(System.in);
        System.out.println(test.generate(in.nextInt()));
    }
}

可以看到成功运行


本次的题目讲解结束啦~🎉🎉

🌹感谢支持!🌹

相关推荐
艾莉丝努力练剑1 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
黑听人16 分钟前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
邓不利东1 小时前
Spring中过滤器和拦截器的区别及具体实现
java·后端·spring
witton1 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
草履虫建模2 小时前
Redis:高性能内存数据库与缓存利器
java·数据库·spring boot·redis·分布式·mysql·缓存
苹果醋32 小时前
Vue3组合式API应用:状态共享与逻辑复用最佳实践
java·运维·spring boot·mysql·nginx
枯萎穿心攻击2 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau2 小时前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang
nananaij2 小时前
【Python基础入门 re模块实现正则表达式操作】
开发语言·python·正则表达式
Micro麦可乐2 小时前
Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
java·开发语言·加密算法·aes加解密·rsa加解密·hash算法