杨辉三角形II(Pascal's Triangle II)
杨辉三角形II(Pascal's Triangle II)
问题
给出一个索引k,返回杨辉三角形的第k行。
例如,给出k = 3,返回[1, 3, 3, 1]
注意:
你可以优化你的算法使之只使用O(k)的额外空间吗?
初始思路
首先来复习复习杨辉三角形的性质(来自wiki):
- 杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。
- 第
行的数字个数为
个。 - 第
行的第
个数字为组合数
。 - 第
行数字和为
。 - 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第
行第
个数字等于第
行的第
个数字与第
个数字的和)。这是因为有组合恒等式:
。可用此性质写出整个杨辉三角形。
看到第2条和5条是不是发现和 [LeetCode 120] - 三角形(Triangle) 中的最终算法有点像?没错,这里可以使用类似的方法得出杨辉三角形中第k行的数据,而且更简单:
- 第1列和最后1列的数字永远为1
- 其他列如性质5所述,为上一行纵坐标j-1和纵坐标j的点之和
最终得出的只是用O(k)额外空间的代码如下:
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 };
杨辉三角形II(Pascal's Triangle II)的更多相关文章
- [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 ...
- LeetCode 118:杨辉三角 II Pascal's Triangle II
公众号:爱写bug(ID:icodebugs) 作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. Given a non-negative index k whe ...
- 【LeetCode】119. 杨辉三角 II Pascal‘s Triangle II(Python & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 方法一: 空间复杂度 O ( k ∗ ( k + 1 ...
- [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)
问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O(k)的额外空间吗? 初始思路 首先来复习复习杨辉三角形的性质 ...
- 119 Pascal's Triangle II 帕斯卡三角形 II Pascal's Triangle II
给定一个索引 k,返回帕斯卡三角形(杨辉三角)的第 k 行.例如,给定 k = 3,则返回 [1, 3, 3, 1].注:你可以优化你的算法到 O(k) 的空间复杂度吗?详见:https://leet ...
- 学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4
当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...
- 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 ...
- 【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, ...
- Pascal's Triangle,Pascal's Triangle II
一.Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, giv ...
随机推荐
- Linux环境编程相关的文章
Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...
- 一个意想不到的CDO.Message 错误
原文:一个意想不到的CDO.Message 错误 几个月之前,写了一个服务从MSMQ取消息发群发邮件的程序,一直也没时间测试,今日一试,出现发送邮件时报错,异常情况如下: "Syst ...
- Asp.net vNext 学习1
Asp.net vNext 学习之路(一) 概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- VBS学习日记(一个) 开始了解
Vbs 一个 Windows 脚本,其代表 :Microsoft Visual Basic Script Editon.( 微软可视化BASIC 脚本版),VBS 是 Visual Basic 的的一 ...
- C语言生成2000w行数据
最近一直抽空学习shell,脚本语言看多了多多少少有些蛋疼不适,所以捡起以前遇到的一个C语言的问题看看. 原先应该是在C++吧关注的一个帖子,楼主为了测试数据库性能需要如下形式的数据要求: 字符串长度 ...
- asp.net mvc使用validate.js验证 若name属性包含特殊字符则加上双引号即可
rules: { "Can.CName": { required: true, ...
- 第三方控件netadvantage UltraWebGrid总结
1.个人习惯前台绑定好实体字段,禁止自动生成:一些属性设置:AutoGenerateColumns="false" <igtbl:UltraWebGrid ID=" ...
- 一键部署mono 免费空间
一键部署mono 免费空间支持c# 再也不担心伙食费换空间了 一直以来 部署mono 都是很头疼的事情 因为是我在是不熟悉非win环境,今天偶然发现这个项目,挺好的,分享下 https://githu ...
- JAVA面试精选
JAVA面试精选[Java基础第一部分] 这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对 ...