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

顺利通过Judge Small和Judge Large。

题外

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

 阶乘-有缺陷

  1. 1 class SolutionV2 {
  2. 2 public:
  3. 3 std::vector<int> getRow(int rowIndex)
  4. 4 {
  5. 5 std::vector<int> columnInfo(rowIndex + 1);
  6. 6
  7. 7 nFactorial_ = 1;
  8. 8
  9. 9 for(int i = 1; i <= rowIndex; ++i)
  10. 10 {
  11. 11 nFactorial_ *= i;
  12. 12 }
  13. 13
  14. 14 columnInfo[0] = 1;
  15. 15 columnInfo[rowIndex] = 1;
  16. 16
  17. 17 for(int i = 1; i <= rowIndex / 2; ++i)
  18. 18 {
  19. 19 columnInfo[i] = CaculateCombination(rowIndex, i);
  20. 20 }
  21. 21
  22. 22 int left = 1;
  23. 23 int right = rowIndex - 1;
  24. 24
  25. 25 while(left < right)
  26. 26 {
  27. 27 columnInfo[right] = columnInfo[left];
  28. 28 ++left;
  29. 29 --right;
  30. 30 }
  31. 31
  32. 32
  33. 33 return columnInfo;
  34. 34 }
  35. 35
  36. 36 private:
  37. 37 int64_t CaculateCombination(int n, int k)
  38. 38 {
  39. 39 int64_t kFactorial = 1;
  40. 40 int64_t restFactorial = 1;
  41. 41
  42. 42 for(int i = 1; i <= k; ++i)
  43. 43 {
  44. 44 kFactorial *= i;
  45. 45 }
  46. 46
  47. 47 for(int i = 1; i <= n - k; ++i)
  48. 48 {
  49. 49 restFactorial *= i;
  50. 50 }
  51. 51
  52. 52 return nFactorial_ / (kFactorial * restFactorial);
  53. 53 }
  54. 54
  55. 55 int64_t nFactorial_;
  56. 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. 分布式服务弹性框架“Hystrix”实践与源码研究(一)

    文章初衷 为了应对将来在线(特别是无线端)业务量的成倍增长,后端服务的分布式化程度需要不断提高,对于服务的延迟和容错管理将面临更大挑战,公司框架和开源团队选择内部推广Netflix的Hystrix,一 ...

  2. C语言库函数大全及应用实例二

    原文:C语言库函数大全及应用实例二                                              [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能 ...

  3. 大约PF_RING/Intel 82599/透明VPN一些事

    接近崩溃的边缘,如今,在医院这篇文章地方的想法,小病,我宁愿不吃药瓶.一台笔记本电脑,但无法上网,我不称职.想知道的东西.唯一可用3G,不开的热点.由于没人给我报销流程.这个周末,我只有一天,由于下雨 ...

  4. 添加MySql Metat Database 信息

    有时候我们想看看 一个数据库上面 某种元素(比如表名)的所有信息,在Mysql上 我们可以通过引入information_schema 的方式,就可以非常方便的查看到. 添加步骤 Edit->P ...

  5. PHP+MYSQL分页原理

    1.SQL语句中的limit用法 2.学习分页的一种公式 3.parse_url()解析URL函数 parse_url() 是将URL解析成有固定键值的数组的函数 4.$_SERVER["R ...

  6. AngularJs ng-repeat

    AngularJs ng-repeat 必须注意的性能问题 AngularJs 的 ng-repeat 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题. 在项目中我们使用 ng ...

  7. c#线程的几种启动方法

    一 启动普通线程 ThreadStart与ParameterizedThreadStart建立新线程 优缺点:简单,但难于管理,线程过多会影响系统的性能. 二 启动CLR线程池的工作者线程(普通线程和 ...

  8. C++关于数字逆序输出的两种思路,及字符串逆序输出

    C++关于数字逆序输出的两种思路,及字符串逆序输出 作者:GREATCOFFEE 发布时间:NOVEMBER 15, 2012 分类:编程的艺术 最近在跟女神一起学C++(其实我是不怀好意),然后女神 ...

  9. Date的使用

    方法 说明 Date() 返回当日的日期和时间 getDate() 获取当天(1-31) getDay() 获取当天的星期(0-6) getMonth() 获取月份(0-11) getFullYear ...

  10. Android手机外置SD卡(TF卡)的获取方法

    Android手机上的外置SD卡,起初的时候,即在Android出世的前几年,那时手机的存储是十分有限的,不像现在到处可见16G.32G和64G的存储,因而那时候的手机有的厂商允许插入外置的SD卡,此 ...