LeetCode 118. Pascal's Triangle

题目链接:https://leetcode.com/problems/pascals-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. 什么是Pascals-triangle:

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形(Pascal's-triangle)。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。具体如下图(来自百度百科):

或者

2. Pascals-triangle的性质(主要来自wiki百科)

2.1 以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1

2.2 第n行的数字个数为n个

2.3 第n行数字和为2^(n-1)

2.4 {\displaystyle n}n行的第{\displaystyle k}k个数字为组合数{\displaystyle C_{n-1}^{k-1}}C_{​{n-1}}^{​{k-1}}

2.5 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第n行第k个数字等于第n-1行的第k-1个数字与第k个数字的和)。这是因为有组合恒等式:C_{​{n}}^{​{i}}=C_{​{n-1}}^{​{i-1}}+C_{​{n-1}}^{​{i}}。可用此性质写出整个杨辉三角形。

2.6 杨辉三角形第n层正好对应于二项式{\displaystyle \left(a+b\right)^{n}}\left(a+b\right)^{​{n}}展开的系数。例如第二层1 2 1是幂指数为2的二项式{\displaystyle \left(a+b\right)^{2}}\left(a+b\right)^{​{2}}展开形式{\displaystyle a^{2}+2ab+b^{2}}a^{​{2}}+2ab+b^{​{2}}的系数。

等等

3. 解题思路:

循环计算每行元素,并利用上一行的信息:利用性质2.5, 除每行第一个元素和最后一个元素直接赋值为1外,其余元素为上一行某两个元素之和


提交代码:

(初级代码):

public class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> Pascal_tri = new ArrayList<List<Integer>>(numRows);
        if (numRows == 0) {      //特殊情况直接返回
   return Pascal_tri;
}
        List<Integer> first_row = new ArrayList<Integer>(1);      //首先建立第一行
        first_row.add(1);
        Pascal_tri.add(first_row);      //将第一行加入三角形中
        for (int i = 2; i <= numRows; i++) {
   List<Integer> Pascal_row_i = new ArrayList<>(i);
            Pascal_row_i.add(1);      //每行第一个元素固定为一
   for (int j = 1; j < i-1; j++) {       //考虑中间元素
int sum = Pascal_tri.get(i-2).get(j-1) + Pascal_tri.get(i-2).get(j);      //每行中间元素是上层两个元素之和
Pascal_row_i.add(sum);
   }
   Pascal_row_i.add(1);      //每行最后一个元素固定为一
   Pascal_tri.add(Pascal_row_i);
}
        return Pascal_tri;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值