Leetcode算法之杨辉三角的规律

183 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

题目分析:

由给定的条件,可知,需要创建一个二维的列表,并且只能是存放不定长长度的列表,而不能是数组。

image.png

通过观察,可以发现,杨辉三角结构图由两部分组成,每一行的首尾两个元素值均为1,其余数值为前一行相邻两个元素值的和。假设第i行第j列的元素值表示为E(i, j),i,j取值0,1,2,...,29,则有公式:

E(i,j)={1, i = j  j = 0E(i1,j1)+E(i1,j), i != j  j != 0E(i, j) = \begin{cases} 1& , \text{ i = j $\bigvee$ j = 0}\\ E(i-1, j-1) + E(i-1, j)& , \text{ i != j $\bigwedge$ j != 0} \end{cases}

由此,转化为代码的格式:

"""
    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;
    }
}