简单介绍
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和.
杨辉三角:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
...
示例 1:
输入: numRows = 1
输出: [[1]]
示例 2:
输入: numRows = 4
输出: [[1],[1,1],[1,2,1],[1,3,3,1]]
解题思路:
仔细观察发现杨慧三角类似于一个二维数组,第0列和对角线上的元素全部都是1
其余位置都是上一行正对元素 与 上一行正对元素的前一个元素之和
代码详解
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();
List<Integer> row = new ArrayList<>();
row.add(1);//存入[0][0]的1
ret.add(row);//将[0]行存入二维数组
for (int i = 1; i < numRows; i++) {
List<Integer> prevRow = ret.get(i - 1);//获取上一行
List<Integer> curRow = new ArrayList<>();
curRow.add(1);//每一行开头位置的1
//中间位置
for (int j = 1; j < i; j++) {
int x = prevRow.get(j) + prevRow.get(j - 1);
curRow.add(x);
}
curRow.add(1);//每一行最后位置的1
ret.add(curRow);//将第i行放入
}
return ret;
}
我们可将开头位置和末尾位置的1也放入循环中,用if-else语句进行特殊处理,优化代码如下:
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();
for(int i = 0; i < numRows; ++i){
// 处理杨辉三角第i行,该行总共有i+1个元素
List<Integer> row = new ArrayList<>(i+1);
for(int j = 0; j <= i; ++j){
if(0 == j || j == i){
// 第0列和对角线上的元素全部为1
row.add(1);
}else{
// 其余位置:上行正对元素 + 上行正对元素前一个
row.add(ret.get(i-1).get(j) + ret.get(i-1).get(j-1));
}
}
ret.add(row);
}
return ret;
}
}