> 文章列表 > OJ练习LeetCode-118:杨辉三角

OJ练习LeetCode-118:杨辉三角

OJ练习LeetCode-118:杨辉三角

题目 

118. 杨辉三角 - 力扣(LeetCode)

 

 可以看到,默认的代码块中出现List<List<Integer>>为二级ArrayList,类似于数组中的二维数组。List<元素类型>

在List<List<Integer>>中,元素类型为List<Integer>;

在List<Integer>中,元素类型为Integer。

即每一行为一个线性表,线性表中的元素为Integer类型,最终的杨辉三角也是一个线性表,元素类型为每一行的线性表。

思路 

 接下来,我们分析一下题目:

1.在杨辉三角中,第一行只有一个元素,为数字1;

2.第二行只有两个元素,均为1;

3.第三行有三个元素,为1,2,1(中间的数字2为上一行的两个1相加得到);

4.第四行有四个元素,为1,3,3,1(从第三行开始,需要运算得到的数为当前行数的下标-1,即内层循环为j < i); 

.......

 假设我们有i行,j列,那么每一行的第一个元素和最后一个元素均为1,且第i行的第j个元素就等于i-1行的第j个元素和第j-1个元素之和。

即array[ i ][ j ] = array[ i - 1 ][ j ] + array[ i - 1 ][ j - 1 ]

完整代码

class Solution {public List<List<Integer>> generate(int numRows) {//根据题目已知,numRows为行数if(numRows == 1){//构建一个新的线性表用来存放最终的结果List<List<Integer>> ans = new ArrayList<>();//构建一个新的线性表用来存放每一行的元素List<Integer> row = new ArrayList<>();//将元素1放入第一行中row.add(1);//将第一行放入最终的线性表中ans.add(row);return ans;}if(numRows == 2){//有两行时,先把第一行的线性表加入,再将第二行的线性表加入List<List<Integer>> ans = new ArrayList<>();List<Integer> row = new ArrayList<>();row.add(1);     ans.add(row);   //第一行的线性表加入到最终的线性表中row = new ArrayList<>();row.add(1);row.add(1);ans.add(row);   //第二行的线性表加入到最终的线性表中return ans;}//从第三行开始,中间的元素需要经过运算得出List<List<Integer>> ans = new ArrayList<>();List<Integer> row = new ArrayList<>();row.add(1);     ans.add(row);   //第一行的线性表加入到最终的线性表中row = new ArrayList<>();row.add(1);row.add(1);ans.add(row);   //第二行的线性表加入到最终的线性表中//第三行开始下标为2for(int i = 2;i < numRows;i++){row = new ArrayList<>();row.add(1);List<Integer> lastRow = ans.get(i-1);    //得到上一行的元素for(int j = 1;j < i;j++){int a = lastRow.get(j);int b = lastRow.get(j - 1);row.add(a + b);}row.add(1); //将最后一个元素1放在整行最后ans.add(row);   //将这一行线性表加入到最终结果中    } return ans;}
}

代码优化

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ans = new ArrayList<>();List<Integer> row = new ArrayList<>();row.add(1);ans.add(row);if(numRows == 1){return ans;}row = new ArrayList<>();row.add(1);row.add(1);ans.add(row);if(numRows == 2){return ans;}//从第三行开始(下标为2)for (int i = 2; i < numRows; i++) {row = new ArrayList<>();row.add(1);       //添加每一行第一个元素为1List<Integer> lastrow = ans.get(i-1);   //得到上一行的元素//从每一行第二个元素开始(下标为1)//从第三行开始,需要运算得到的数为当前行数的下标-1for (int j = 1; j < i; j++) {int a = lastrow.get(j);int b = lastrow.get(j -1);row.add(a + b);}row.add(1);ans.add(row);}return ans;}
}