118. Pascal's Triangle

来源:互联网 发布:最权威的行业数据 编辑:程序博客网 时间:2024/06/16 08:16

题目

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]
]

代码

import java.util.ArrayList;import java.util.List;public class Solution {    public static List<List<Integer>> generate(int numRows) {        List<List<Integer>> list = new ArrayList<>();        for(int i=1;i<=numRows;i++){            List<Integer> l = new ArrayList<>();            int v = 0;            for(int j=0;j<i;j++){                if(j==0 || j==i-1){                    v=1;                }                else                    v=(i-j)*v/j;                l.add(v);            }            list.add(l);        }        return list;    }}

思路分析

其实这道题是先看懂了下一题119才写的,所以没有用传统的办法,直接上公式了。

杨辉三角中,其实可以很容易发现每一行的系数就是排列组合
比方说,第五行(numRows = 5时),C(4,0),C(4,1),C(4,2),C(4,3),C(4,4)就是对应的5个数
这里就用到了一个公式,设置一个V(value),并且不断更新它
比方说,
C(4,0)=1;
C(4,1)=4/1;
C(4,2)=(4*3)/(2*1)
C(4,3)=(4*3*2)/(3*2*1)
C(4,4)=1

(我不会写排列组合的MarkDown表现形式…在我学会之前都意会一下吧…看不懂我也木有办法了…..)

可以看出两点:

  1. 第一项和最后一项就不用算了,肯定是1
  2. 中间的每一项,上面每次乘以小一的数,下面每次除以大一的数

    所以现在就应该想怎么完成这个公式
    设它的结构是C(numRows-1,i) ( i 即0,1 ,2, 3,4)
    那么其实
    C(numRows-1,i)=C(numRows-1,i-1)*(numRows-i)/ i
    这就很好写了0.0
    就是每一轮,旧的V被新的V更新~
    v=v*(numRows - i) / i

嗯然后剩下的大循环应该就没什么难度了~值得注意的就是List的add,这是第一次写两层的,还是值得纪念一下的…

就这两个难点了,总结完毕~~有了这个铺垫下一道题简直就容易到飞起了

(这件事说明了一个道理:工具的重要性,如果一直用原理,其实是很费时间和精力的,但是换一个方法,就能大大降低工作量,让代码简洁易懂,也不容易出现纰漏,并且很通用呀..做了一道题相当于两道题..╮(╯▽╰)╭)

原创粉丝点击