zoukankan      html  css  js  c++  java
  • 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+" ");
                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还没整出来,只能后面再看啦

    118. Pascal's Triangle

  • 相关阅读:
    招聘面试—关于Mysql的一点儿总结
    情景linux—不曾了解的cat用法
    情景linux--shell如何实现多线程?
    情景linux--如何解决read命令产生的硬编码问题
    情景linux--如何优雅地退出telnet
    性能测试-概念篇-性能测试分类
    情景linux--如何摆脱深路径的频繁切换烦恼?
    TCP--telnet为何在127s后返回?
    你为什么必须(从现在开始就)掌握linux
    Cookie/Session机制详解
  • 原文地址:https://www.cnblogs.com/yuanzhaoyi/p/5852989.html
Copyright © 2011-2022 走看看