118. Pascal's Triangle

题目:

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+"\n");
            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+"\n");
                    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还没整出来,只能后面再看啦

118. Pascal's Triangle

posted @ 2016-09-08 14:38  PolarBearInterest  阅读(172)  评论(0编辑  收藏  举报