题目概述(简单难度)
给定一个非负整数 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
4:随后再将1添加到i=j处的位置,那么我们每一行的元素都算添加进去了.
5:最后将将整个一行的元素添加到我们的ret集合中,返回ret集合.
总结
考察到了对于list集合的使用,非常经典的一道题目,希望大家多加练习.