题目:
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
代码:
仔细一看,规律就是本层第一个和最后一个的元素都是1,其他的元素分别等于上一层同位置元素加上前一个位置的元素。
一百度,才知道,这就是大名鼎鼎的杨辉三角!只可惜,在欧洲,这个表叫做帕斯卡三角形。
但帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。
布莱士·帕斯卡的著作Traité du triangle arithmétique(1655年)介绍了这个三角形。帕斯卡搜集了几个关于它的结果,并以此解决一些概率论上的问题,影响面广泛,Pierre Raymond de Montmort(1708年)和亚伯拉罕·棣·美弗(1730年)都用帕斯卡来称呼这个三角形。
估计由于发现该规律后对数学界的影响吧,于是就成为了Pascal's Triangle.
具体的数学定义还有很多,请自行百度。
用java实现,根据规律,不是很复杂,但由于经验,还是折腾了好久,不过还算顺利:
//Pascal's Triangle(杨辉三角),根据层数构建相应的杨辉三角
public List<List<Integer>> generate(int numRows) {
//创建元素为List<Integer>的链表list
List<List<Integer>> list = new ArrayList<>();
if (numRows<=0)
{
return list;
}
//构建一个元素构成的第一次,不依赖上一层
List<Integer> list1 = new ArrayList<Integer>(1);
list1.add(0, 1);
list.add(list1);
if (numRows==1)
{
return list;
}
//每层递增,通过循环创建每层的链表,并计算元素值
//由于链表不能根据任意序号插入元素,所以元素的插入还是按顺序来的
for (int i = 2;i <= numRows; i++)
{
System.out.print("循环: "+i+"
");
List<Integer> e = new ArrayList<Integer>(i);
e.add(0,1);
//从第三层开始,本次处两端元素为1,其余都根据上层相应元素求出
if(i>2)
{
for (int j = 1;j < i-1;j++)
{
System.out.print("i: "+i+" "+"j: "+j+"
");
int num = list.get(i-2).get(j-1)+ list.get(i-2).get(j);
e.add(j, num);
}
}
e.add(i-1,1);
list.add(e);
}
return list;
}
完全按照定义实现,为了保障返回根据题目要求,返回List<List<Integer>>,所以直接用ArrayList。
结果:
同样代码提交了两次,一次4ms,一次5ms,不明觉厉。
结果分布leetcode还没整出来,只能后面再看啦