🎉欢迎大家收看,请多多支持🌹
🥰关注小哇,和我一起成长🚀个人主页🚀
⭐目前主更 专栏Java ⭐数据结构
⭐已更专栏有C语言、计算机网络⭐
题目链接:杨辉三角
目录👑
⭐题目描述:
🌙大体分析:
🔆题目代码及详解
⭐题目描述:
🌙大体分析:
我们可以看到题中要求我们用列表来写这个题,
List<List<Integer>>是一个嵌套列表,列表里面存放的也是列表,且存放的列表里面存放的是Integer类型的对象。这类似与一个二维数组。
所以我们可以先创建一个嵌套列表对象,由于第一行始终只有一个数字1,我们可以先添加进去:
List<List<Integer>> list = new ArrayList<>();List<Integer> list1 = new ArrayList<>();list1.add(1);list.add(list1);
现在画图来分析一下
我们可以看到每一行的首位数字都是1,而这之间的数字都是由上一行的同列数字加上前一个数字。
比如,图中红色的3由上一行同列的2和2的前一个数字1相加得来。
因此我们可以利用循环来将每一行中间的数字用上面的方法算出来,我们要注意,是只有每一行除了首尾的数字才这样计算,所以注意循环的判断条件和初始值。
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。
每一行列表的数字添加好后,记得还要将这个列表添加进外层列表。
🔆题目代码及详解
该题总的代码:
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中打印出列表看到效果:
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()));}
}
可以看到成功运行
本次的题目讲解结束啦~🎉🎉
🌹感谢支持!🌹