杨辉三角形II(Pascal's Triangle II)

问题

给出一个索引k,返回杨辉三角形的第k行。

例如,给出k = 3,返回[1, 3, 3, 1]

注意:

你可以优化你的算法使之只使用O(k)的额外空间吗?

初始思路

首先来复习复习杨辉三角形的性质(来自wiki):

  1. 杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。
  2. 行的数字个数为个。
  3. 行的第个数字为组合数
  4. 行数字和为
  5. 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:。可用此性质写出整个杨辉三角形。

看到第2条和5条是不是发现和 [LeetCode 120] - 三角形(Triangle) 中的最终算法有点像?没错,这里可以使用类似的方法得出杨辉三角形中第k行的数据,而且更简单:

  • 第1列和最后1列的数字永远为1
  • 其他列如性质5所述,为上一行纵坐标j-1和纵坐标j的点之和

最终得出的只是用O(k)额外空间的代码如下:

 getRow

1 class Solution {
2 public:
3 std::vector<int> getRow(int rowIndex)
4 {
5 std::vector<int> columnInfo(rowIndex + 1);
6
7 columnInfo[0] = 1;
8
9 if(rowIndex == 0)
10 {
11 return columnInfo;
12 }
13
14 columnInfo[1] = 1;
15
16 for(int i = 1; i < rowIndex + 1; ++i)
17 {
18 for(int j = i; j > 0; --j)
19 {
20 if(j == 0 || j == i)
21 {
22 columnInfo[j] = 1;
23 }
24 else
25 {
26 columnInfo[j] = columnInfo[j - 1] + columnInfo[j];
27 }
28 }
29 }
30
31 return columnInfo;
32 }
33 };

顺利通过Judge Small和Judge Large。

题外

根据杨辉三角形的性质3,我们也可以直接计算某行所有数的值。由于对称性,实际只需要计算前一半的列并将结果拷贝到后一半列即可。但是这种方法的问题是需要计算很大的阶乘,当行数达到一定大小时不做特殊处理就会溢出了。以下是一个示例,没做特殊处理,只是用int64_t保存中间结果。当输入为21时就会溢出了:

 阶乘-有缺陷

1 class SolutionV2 {
2 public:
3 std::vector<int> getRow(int rowIndex)
4 {
5 std::vector<int> columnInfo(rowIndex + 1);
6
7 nFactorial_ = 1;
8
9 for(int i = 1; i <= rowIndex; ++i)
10 {
11 nFactorial_ *= i;
12 }
13
14 columnInfo[0] = 1;
15 columnInfo[rowIndex] = 1;
16
17 for(int i = 1; i <= rowIndex / 2; ++i)
18 {
19 columnInfo[i] = CaculateCombination(rowIndex, i);
20 }
21
22 int left = 1;
23 int right = rowIndex - 1;
24
25 while(left < right)
26 {
27 columnInfo[right] = columnInfo[left];
28 ++left;
29 --right;
30 }
31
32
33 return columnInfo;
34 }
35
36 private:
37 int64_t CaculateCombination(int n, int k)
38 {
39 int64_t kFactorial = 1;
40 int64_t restFactorial = 1;
41
42 for(int i = 1; i <= k; ++i)
43 {
44 kFactorial *= i;
45 }
46
47 for(int i = 1; i <= n - k; ++i)
48 {
49 restFactorial *= i;
50 }
51
52 return nFactorial_ / (kFactorial * restFactorial);
53 }
54
55 int64_t nFactorial_;
56 };
 
 
分类: LeetCode
标签: c++leetcode算法

杨辉三角形II(Pascal's Triangle II)的更多相关文章

  1. [Swift]LeetCode119. 杨辉三角 II | Pascal's Triangle II

    Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...

  2. LeetCode 118:杨辉三角 II Pascal's Triangle II

    公众号:爱写bug(ID:icodebugs) 作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. Given a non-negative index k whe ...

  3. 【LeetCode】119. 杨辉三角 II Pascal‘s Triangle II(Python & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 方法一: 空间复杂度 O ( k ∗ ( k + 1 ...

  4. [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)

    问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O(k)的额外空间吗? 初始思路 首先来复习复习杨辉三角形的性质 ...

  5. 119 Pascal's Triangle II 帕斯卡三角形 II Pascal's Triangle II

    给定一个索引 k,返回帕斯卡三角形(杨辉三角)的第 k 行.例如,给定 k = 3,则返回 [1, 3, 3, 1].注:你可以优化你的算法到 O(k) 的空间复杂度吗?详见:https://leet ...

  6. 学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4

    当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...

  7. 28. Triangle && Pascal's Triangle && Pascal's Triangle II

    Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...

  8. 【LeetCode】118 & 119 - Pascal's Triangle & Pascal's Triangle II

    118 - Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, ...

  9. Pascal's Triangle,Pascal's Triangle II

    一.Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, giv ...

随机推荐

  1. 20款最好的免费的IDES和编辑器

    程序员编程利器:20款最好的免费的IDES和编辑器 Posted on 2015-02-17 21:52 尛鱼 阅读(170) 评论(1) 编辑 收藏 程序员编程利器:20款最好的免费的IDEs和编辑 ...

  2. linux下mysql的远程连接

    在服务器上安装mysql后,想使用本地的mysql客户端连接数据库时,提示不允许连接,比较郁闷,找到了这篇文章解决了我的问题: 内容如下: 本地计算机ip:192.168.1.100远程计算机ip:1 ...

  3. MySQL 存储过程 经常使用语法

    MySQL 存储过程是从 MySQL 5.0 開始添加的新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装.特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库 ...

  4. adb概览及协议参考

    原文:https://github.com/android/platform_system_core/blob/master/adb/OVERVIEW.TXT) Implementation note ...

  5. JS document 获取 html对象的问题

    在了解document.getElementById()方法的时候,没有留意到被获取的对象的声明时的位置, 一个很基础很细节的问题. 比如说 这个js的引入位置: -----------------a ...

  6. leetcode 第42题 Multiply Strings

    题目:Given two numbers represented as strings, return multiplication of the numbers as a string. Note: ...

  7. placeholder 属性的支持

    placeholder 是HTML5的. 在IE6-8中不能使用.可以使用  JQ 来设置. 给input一个value, JQ判断得到焦点时  value="": 移开焦点时,若 ...

  8. 微软的权限框架Asp.Net Identity

    Asp.Net Identity 深度解析 之 注册登录的扩展   关于权限每个系统都有自己的解决方案,今天我们来讨论一下微软的权限框架Asp.Net Identity ,介绍如下  http://w ...

  9. 安装uBuntu操作系统 - 初学者系列 - 学习者系列文章

    uBuntu是一款不错的Linux操作系统,在上面的应用软件不少,就是说它的支持率挺高.下面就对这款操作系统的安装做下介绍. 1.  下载uBuntu安装文件 打开中文页面.http://www.ub ...

  10. 使用jQuery热门功能实现

    非常多站点上都有返回顶部的效果,本文阐述怎样使用jquery实现返回顶部button. 首先须要在顶部加入例如以下html元素: <p id="back-to-top"> ...