给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
定义一个双层的线性表
List<List<Integer>> result
里层代表每一层保存的数字,外层代表整个杨辉三角保存的数字
总结一下杨辉三角特点:
第一行固定就是 1
第二行也固定就是两个 1
第 i 行,首尾元素固定都是 1
第 i 行有 i 个元素,
对于第 i 行 来说,第 j 列的值就是 i -1 行 j - 1 列值加上 i - 1 行 j 列值之和
举个例子:
第 3 行,第 3 列的值就是第 2 行,第 2 列的值 加上第 2 行,第 3 列的值
需要注意的是,第 i 行的下标是 i - 1,所以在求下标的时候需要多减一次 1
代码实现
class Solution {
public List<List<Integer>> generate(int numRows) {
if (numRows <= 0){
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
List<Integer> firstLine = new ArrayList<>();
firstLine.add(1);
result.add(firstLine);
if (numRows == 1){
return result;
}
List<Integer> second = new ArrayList<>();
second.add(1);
second.add(1);
result.add(second);
if (numRows == 2){
return result;
}
/**
* 接下来处理第 i 行的情况
* 第 i 行有 i 列
* (i,j) = (i - 1,j -1) + (i - 1, j)
* 第一个元素和最后一个元素都是 1
*/
for (int rows = 3;rows <= numRows; rows++){
List<Integer> preLines = result.get(rows - 1 - 1);
List<Integer> curLines = new ArrayList<>();
curLines.add(1);
for (int col = 2; col < rows; col++){
curLines.add(preLines.get(col - 1 - 1) + preLines.get(col - 1));
}
curLines.add(1);
result.add(curLines);
}
return result;
}
}