题目
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); //第二行的线性表加入到最终的线性表中
//第三行开始下标为2
for(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); //添加每一行第一个元素为1
List<Integer> lastrow = ans.get(i-1); //得到上一行的元素
//从每一行第二个元素开始(下标为1)
//从第三行开始,需要运算得到的数为当前行数的下标-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);
ans.add(row);
}
return ans;
}
}