在线OJ网址https://leetcode-cn.com/problems/pascals-triangle/ 杨辉三角我们都很了解了,现在我们要编写这么一个程序,例如在这里我们输入5 就会输出一个5行的杨辉三角如下
这道题的思路我分为一下几个步骤
合法性判断,如果输入的行数小于0,返回一个空链表第一行永远等于1,如果输入行数为1,则输出为1第二行永远是两个1,如果输入行数为2,则输入,第一行的1和第二行的两个1后续情况,第row行的元素个数也为row,即行数列数相等第row行的第一个元素和最后一个元素都为1,中间元素为前一行的前一列加相同列为了更好的理解,我们把整个结果当作一个大容器,每个大容器都有一个小容器,在这里就是我说的行,每个小容器都有几个元素(数字)就是我说的列
具体实现代码如下
class Solution { public List<List<Integer>> generate(int numRows) { //1.合法性判断 if(numRows < 0){ return new ArrayList<>(); } //创建大容器 List<List<Integer>> result = new ArrayList<>(); List<Integer> firstLine = new ArrayList<>(); firstLine.add(1); result.add(firstLine); //第一行只有一个1 if(numRows == 1){ return result; } //第二行只有两个1 List<Integer> secondLine = new ArrayList<>(); secondLine.add(1); secondLine.add(1); result.add(secondLine); if(numRows == 2){ return result; } //后续情况,这里需要注意,row是行数和numrows对应,不是下标 for (int row = 3; row <= numRows; row++) { //获取到前一行,row-1是得到这一行的下标,在减一才是前一行 List<Integer> prevLine = result.get(row - 1 -1); List<Integer> curLine = new ArrayList<>(); curLine.add(1); //col=1是小容器下标为1的元素,所以前闭后开 for (int col = 1; col < row - 1; col++) { curLine.add(prevLine.get(col - 1) + prevLine.get(col)); } curLine.add(1); result.add(curLine); } return result; } }