本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Leetcode 103题 杨辉三角
题目描述
给定一个非负整数
numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
输入示例1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
输入示例2:
输入: numRows = 1
输出: [[1]]
题目分析:
由给定的条件,可知,需要创建一个二维的列表,并且只能是存放不定长长度的列表,而不能是数组。
通过观察,可以发现,杨辉三角结构图由两部分组成,每一行的首尾两个元素值均为1,其余数值为前一行相邻两个元素值的和。假设第i行第j列的元素值表示为E(i, j),i,j取值0,1,2,...,29,则有公式:
由此,转化为代码的格式:
"""
i: 当前元素所在行数,取下标值,由0开始
j: 当前元素所在列数,取下标值,由0开始
current_value: 当前元素取值
elementList: 杨辉三角的总列表
"""
if(j == 0 || j == i) {
current_value = 1;
} else {
List<Integer> preRowList = elementList.get(i-1); // 取得上一行的元素
current_value = preRowList.get(j-1) + preRowList.get(j);
}
完整代码:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> yhTriangle = new ArrayList<List<Integer>>();
for(int i = 0; i < numRows; i++) {
List<Integer> subNums = new ArrayList<Integer>();
int j = 0;
while(j <= i) {
if(j == 0 || j == i) {
subNums.add(1);
} else {
List<Integer> preSubNums = yhTriangle.get(i-1);
int current_value = preSubNums.get(j-1) + preSubNums.get(j);
subNums.add(current_value);
}
j++;
}
yhTriangle.add(subNums);
}
return yhTriangle;
}
}