[LeetCode]15. Pascal's 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. 杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。
  2. 行的数字个数为个。
  3. 行的第个数字为组合数
  4. 行数字和为
  5. 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:

解法1:根据杨辉三角的构造方法直接构造。

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector< vector<int> > res;
        for(int i = 0; i < numRows; i++)
        {
            vector<int> row(i + 1, 1);
            for(int j = 1; j < i; j++)
                row[j] = res[i - 1][j - 1] + res[i - 1][j];
            res.push_back(row);
        }
        return res;
    }
};

解法2:杨辉三角的每一行的各元素即是组合数C(m,n),其中n表示第几行,m=0,1,...,n,使用公式C(m,n)=n!/m!/(n-m)!

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector< vector<int> > res;
        for(int i = 0; i < numRows; i++)
        {
            vector<int> row(i + 1, 1);
            for(int j = 0; j <= i; j++)
                row[j] = fact(i) / fact(j) / fact(i - j);
            res.push_back(row);
        }
        return res;
    }
private:
    long long fact(int n)
    {
        if(n <= 1)
            return 1;
        long long f = 1, res;
        for(int i = 2; i <= n; i++)
        {
            res = f * i;
            f = res;
        }
        return res;
    }
};

注意这个不能通过全部测试,原因在于numRows比较大时计算阶乘会溢出。考虑组合数计算的另外的公式C(m,n)=C(m-1,n-1)+C(m,n-1)可以改进:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector< vector<int> > res;
        for(int i = 0; i < numRows; i++)
        {
            vector<int> row = getRow(i);
            res.push_back(row);
        }
        return res;
    }
private:
    vector<int> getRow(int rowIndex) {
        vector<int> row;
        if (rowIndex < 0)
            return row;

        row.assign(rowIndex + 1, 0);
        for (int i = 0; i <= rowIndex; ++i)
        {
            if (i == 0)
            {
                row[0] = 1;
                continue;
            }
            for (int j = rowIndex; j >= 1; --j)
                row[j] = row[j] + row[j - 1];
        }
        return row;
    }
};

这个方法效率比较差,因为为了计算第row行的数据,首先将第1行到第row-1行的所有数据都计算了一遍。

[LeetCode]15. Pascal's Triangle杨辉三角

时间: 2024-10-23 09:40:13

[LeetCode]15. Pascal's Triangle杨辉三角的相关文章

[LeetCode] 118. Pascal&#39;s 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] ] 杨辉三角形,又称贾宪三角形.帕斯卡三角形.海亚姆三角形.巴斯卡三角形,是二项式系数在的一种写法,形似三角形,在中国首现于南宋杨辉的<详解九章算术>得名,书中杨辉说明是引自贾宪的<释锁算术>

LeetCode (13) Pascal&#39;s Triangle (杨辉三角 )

题目描述 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return 从第三行开始,每行除了最左边和最右边两个数为1,其他数字都是上一行中相邻两个数字之和.根据上述规则可以写出下面的代码: class Solution { public: vector<vector<int> > generateRow1() { vector<in

(LeetCode)Pascal&#39;s 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] ] Subscribe to see which companies asked this question 解题分析: 题目的这个帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉

Pascal&#39;s 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] ] 杨辉三角是二项式系数的一种写法,如果熟悉杨辉三角的五个性质,那么很好生成,可参见我的上一篇博文: http://www.cnblogs.com/grandyang/p/4031536.html 具体生

POJ 3146 &amp; HDU 3304 Interesting Yang Yui Triangle(杨辉三角)

题目链接: HDU 3304 :http://acm.hdu.edu.cn/showproblem.php?pid=3304 POJ 3146  :http://poj.org/problem?id=3146 Problem Description Harry is a Junior middle student. He is very interested in the story told by his mathematics teacher about the Yang Hui trian

[LeetCode] 119. Pascal&#39;s Triangle II 杨辉三角 II

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3,3,1]. Note:Could you optimize your algorithm to use only O(k) extra space? 118. Pascal's Triangle 的拓展,给一个索引k,返回杨辉三角的第k行. 解法:题目要求优化到 O(k) 的空间复杂,那么就不能把每

如何用C++打印杨辉三角

下面是杨辉三角的一部分,我们观察观察它有什么规律: 1 1      1 1     2     1 1     3     3     1 1     4     6     4     1 1     5    10    10    5    1 1     6    15    20   15    6    1 1     7     21    35   35   21   7    1 ................ 通过观察不难发现,三角的两边都是1,而且除边界外的每个数的值都

Pascal&#39;s Triangle leetcode java(杨辉三角)

题目: 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] ] 题解:既然讲到了Pascal‘s Triangle,即杨辉三角.那么就先去Wikipedia上面复习一下杨辉三角吧:”杨辉三角形,又称賈憲三角形.帕斯卡三角形.海亚姆三角形,是二项式係數在的

LeetCode 118. Pascal&#39;s 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] ] 题目标签:Array 题目给了我们一个numRows,让我们写出这个行数的杨辉三角.来观察一下原题例子,5行的话,第一行只有1,第二行,只有1,第三行,除去第一个1和最后一个1,中间的都是上一行的两边