问题描述
其实就是杨辉三角,题目看网址:https://leetcode.com/problems/pascals-triangle/
解决思路
主要有几个地方需要处理:
- 通过遍历上一行元素,将当前元素由其左上角和右上角元素之和获得
- 每行最后一个元素1,要单独加入
- 要使用双层List(
List<List<>>
),内层List是每一行所有元素的集合,外层List是内层所有List组成的集合。
其他更仔细地,代码注释写的很详细了。
问题解惑
- 第一次的it.hasNext(),是第0个元素。一开始以为是第0个元素的下一个元素,这样是错的。
- 同样的,每次循环的第一个it.next(),也是第0个元素。firstAdd = 0,secondAdd = it.next() = 1, firstAdd + secondAdd = 0 + 1 = 1,这就是每行第0个元素哪里来的原因。
代码
package leetcode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class PascalsTriangle {
public List<List<Integer>> generate(int numRows) {
List<Integer> TriangleRows = new ArrayList<>();//三角形的行数
List<List<Integer>> PascalTriangle = new ArrayList<>();//用于保存输出三角
//特殊情况判定
if (numRows == 0) return PascalTriangle;
//第一行加入初始值1
TriangleRows.add(1);
//将初始值加入三角
PascalTriangle.add(TriangleRows);
//只有一行的,单独处理
if (numRows == 1) return PascalTriangle;
//从第二行开始遍历三角形行数
for (int i = 2; i <= numRows; i++){
//迭代器,用于遍历上一行的元素
Iterator<Integer> it = TriangleRows.iterator();
//用于存放第一个加数
int firstAdd = 0;
//用于存放两个加数的和
List<Integer> sum = new ArrayList<>();
while(it.hasNext()){
//第二个加数,整个过程讲遍历整行元素
int secondAdd = it.next();
//将和加入sum
sum.add(firstAdd+secondAdd);
//将第二个加数赋给第一个加数,使第一个加数后移
firstAdd = secondAdd;
}
sum.add(1);//将每行最后一个数设为1,单独处理
PascalTriangle.add(sum);//将处理完毕的sum加入最终三角
TriangleRows = sum;//将sum赋值给Triangle,sum下移
}
return PascalTriangle;
}
}
小感想
**注意: **