题目概述(简单难度)
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
附上leetcode链接:
点击此处进入leetcode
思路与代码
思路展现
题目中这个杨辉三角有那么一点别扭,我们来给出一个好识别的杨辉三角吧:
为了有助于找到隐藏的信息,先将杨辉三角按左对齐方式排列:
如果把上述杨辉三角按照行和列
的形式画出来,如下所示:
我们用i表示行,j表示列:
我们可以看到每一个list的第一个和最后一个都是1,中间的某个数字等于上一行相同列中的list的数字加上一行前一列中list的数字,例如3=1+2.
代码示例
class Solution {
public List<List<Integer>> generate(int numRows) {
//ret代表我们的行
List<List<Integer>> ret = new ArrayList<>();
if (numRows <= 0) {
return ret;
}
//第一行的list
List<Integer> list = new ArrayList<>();
//把第一行第一列的1先加进去
list.add(1);
//把第一行的list放到ret当中
ret.add(list);
//i表示行数,此时从第二行开始插入元素
for (int i = 1; i < numRows; i++) {
//curRow表示当前行
List<Integer> curRow = new ArrayList<>();
//将每一行最开始的1先添加上
curRow.add(1);
//j表示列数
for (int j = 1; j < i; j++) {
//这个for循环中就是确认当前i!=j的时候的元素
//这个元素是由上一行的当前列的元素+上一行的当前列的前一个元素
List<Integer> prevRow = ret.get(i - 1);
int num = prevRow.get(j - 1) + prevRow.get(j);
//将i!=j处的元素进行添加
curRow.add(num);
}
//手动将i=j处的1添加上去,注意循环的终止条件为j<i
curRow.add(1);
//最后将整个一行的元素添加到我们的ret集合中
ret.add(curRow);
}
return ret;
}
}
代码思路是这样的:
1:首先把杨辉三角中的第一行的数字1先添加进去
2:然后从第二行开始进行for循环,杨辉三角的存储方式其实就是二维数组
,所以我们第一个for循环就先遍历我们的行
,从第二行开始遍历,但是第二行的下标为1.故i=1
因为杨辉三角每行的第一个和最后一个都是1,所以当遍历行的时候,我们先把1插入到每行的第一个元素处,然后再遍历我们其他列,进行我们第二个for循环
3:进入到我们第二个for循环后,因为这个循环是遍历我们的列
,且第一列每次都将1添加进去了,所以j的遍历是从1开始的,最重要的点是j的循环终止条件到底是什么呢?我们可以发现是j<i
,也就是说当j!=i
的时候数字都不等于1,这些数字都是由上一行的当前列加上一行的当前列的前一列构成的
,所以此处我们首先需要获得上一行的所有元素,使用ret.get(i-1)来获取,因为ret表示的就是行,他也是一个list集合.获取到后再使用get方法获取到两个元素并相加.
4:随后再将1添加到i=j处的位置,那么我们每一行的元素都算添加进去了.
5:最后将将整个一行的元素添加到我们的ret集合中,返回ret集合.
总结
考察到了对于list集合的使用,非常经典的一道题目,希望大家多加练习.