题目链接: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 第行的第个数字为组合数
2.5 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:。可用此性质写出整个杨辉三角形。
2.6 杨辉三角形第n层正好对应于二项式展开的系数。例如第二层1 2 1是幂指数为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;
}
}