杨辉三角形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. Java导出页面数据或数据库数据至Excel文件并下载,采用JXL技术,小demo(servlet实现)

    public class ExportExcelServlet extends HttpServlet { /** * */ private static final long serialVersi ...

  2. 蓝色的成长记录——追逐DBA(8):为了夺回SP报告,回顾oracle的STATSPACK实验

    ***********************************************声明*************************************************** ...

  3. 在Installshield的安装进度中显示自己设置的信息

    原文:在Installshield的安装进度中显示自己设置的信息 以Installscript msi project为例,在installshield所制作的安装包安装过程中显示安装进度的,就在On ...

  4. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  5. 关于WIN32.EXE变态木马下载器的解决办法

    一.WIN32.EXE的来源:http://fdghewrtewrtyrew.biz/adv/130/win32.exe 二.运行后的表现:此WIN32.EXE通过80和8080端口访问若干个IP,若 ...

  6. SQL点滴19—T-SQL中的透视和逆透视

    原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣, ...

  7. Gimp教程:简约手机图标风格

    效果:       在一个国外博客上翻到的图标制作教程,效果类似于Cowon J3的默认图标风格. 制作过程很简单,只需两三步,不多说了,上步骤 Step1.新建50×50的黑色背景 Step2.新建 ...

  8. 【c#操作office】--OleDbDataAdapter 与OleDbDataReader方式读取excel,并转换为datatable

    OleDbDataAdapter方式: /// <summary> /// 读取excel的表格放到DataTable中 ---OleDbDataAdapter /// </summ ...

  9. 基于Jcrop的图片上传裁剪加预览

    最近自己没事的时候研究了下图片上传,发现之前写的是有bug的,这里自己重新写了一个! 1.页面结构 <!DOCTYPE html> <html lang="en" ...

  10. HubbleDotNet全文搜索数据库组件(二)

    [摘要]本文介绍如何使用HubbleDotNet实现基本的全文搜索,包括建立搜索数据库.数据表.建立索引,压缩索引和搜索示例等内容. 上文介绍了HubbleDotNet的安装,接下来介绍如何使用Hub ...