[LeetCode 119] - 杨辉三角形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)额外空间的代码如下:
class Solution {
public:
std::vector<int> getRow(int rowIndex)
{
std::vector<int> columnInfo(rowIndex + );
columnInfo[] = ;
if(rowIndex == )
{
return columnInfo;
}
columnInfo[] = ;
for(int i = ; i < rowIndex + ; ++i)
{
for(int j = i; j > ; --j)
{
if(j == || j == i)
{
columnInfo[j] = ;
}
else
{
columnInfo[j] = columnInfo[j - ] + columnInfo[j];
}
}
}
return columnInfo;
}
};
getRow
顺利通过Judge Small和Judge Large。
题外
根据杨辉三角形的性质3,我们也可以直接计算某行所有数的值。由于对称性,实际只需要计算前一半的列并将结果拷贝到后一半列即可。但是这种方法的问题是需要计算很大的阶乘,当行数达到一定大小时不做特殊处理就会溢出了。以下是一个示例,没做特殊处理,只是用int64_t保存中间结果。当输入为21时就会溢出了:
class SolutionV2 {
public:
std::vector<int> getRow(int rowIndex)
{
std::vector<int> columnInfo(rowIndex + );
nFactorial_ = ;
for(int i = ; i <= rowIndex; ++i)
{
nFactorial_ *= i;
}
columnInfo[] = ;
columnInfo[rowIndex] = ;
for(int i = ; i <= rowIndex / ; ++i)
{
columnInfo[i] = CaculateCombination(rowIndex, i);
}
int left = ;
int right = rowIndex - ;
while(left < right)
{
columnInfo[right] = columnInfo[left];
++left;
--right;
}
return columnInfo;
}
private:
int64_t CaculateCombination(int n, int k)
{
int64_t kFactorial = ;
int64_t restFactorial = ;
for(int i = ; i <= k; ++i)
{
kFactorial *= i;
}
for(int i = ; i <= n - k; ++i)
{
restFactorial *= i;
}
return nFactorial_ / (kFactorial * restFactorial);
}
int64_t nFactorial_;
};
阶乘-有缺陷
[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)的更多相关文章
- 杨辉三角形II(Pascal's Triangle II)
杨辉三角形II(Pascal's Triangle II) 问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O( ...
- 【LEETCODE】34、119题,Pascal's Triangle II
package y2019.Algorithm.array; import java.util.ArrayList; import java.util.List; /** * @ProjectName ...
- 【LeetCode】119. 杨辉三角 II Pascal‘s Triangle II(Python & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 方法一: 空间复杂度 O ( k ∗ ( k + 1 ...
- LeetCode 118:杨辉三角 II Pascal's Triangle II
公众号:爱写bug(ID:icodebugs) 作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. Given a non-negative index k whe ...
- [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 ...
- 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
当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...
- leetcode 118. Pascal's Triangle 、119. Pascal's Triangle II 、120. Triangle
118. Pascal's Triangle 第一种解法:比较麻烦 https://leetcode.com/problems/pascals-triangle/discuss/166279/cpp- ...
- 【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, ...
随机推荐
- selenium webdriver python 环境搭建
1. 安装python https://www.python.org/getit/ 选择2.7版本,下载安装即可. 验证是否安装成功:打开cmd,输入"python -V",显示p ...
- Linux 下最为人熟知的解压缩工具
很多时候,通过互联网发送或接收大文件和图片是一件令人头疼的事.压缩及解压缩工具正好可以应对这个问题.下面让我们快速浏览一些可以使得我们的工作更加轻松的开源工具. Tar Tar 由 ‘Tape arc ...
- 修改CKFinder上传路径
一.CKFinder的若干问题 1.单独使用 ckfinder从原fckeditor分离出来以后可以单独使用,通常我习惯于在工具栏中添加ckfinder.dll,这样以后要使用ckfinder直接从工 ...
- linux if 判断字符串是否相等
在命令行中修改时间: 如果linux系统时间等于2017-09-09,则ok:否则将当前系统时间修改为2017-09-09 var=`date '+%Y-%m-%d'`;if [ "$var ...
- SKEmitterNode类
继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架 /System/L ...
- Andrdoid中相应用程序的行为拦截实现方式之----从Java层进行拦截
致谢: 感谢 简行之旅的这篇blog:http://blog.csdn.net/l173864930/article/details/38455951,这篇文章是參考这篇blog的进行一步一步操作的, ...
- Android 之 自定义标签 和 自定义组件
1 自定义标签 这是我的模板项目目录 既然想像 android:text 那样使用自己的标签,那么首先得有标签. 在 res/values/ 下我新建了个 mm_tag.xml (切记 ...
- (转) [教程] Unity3D中角色的动画脚本的编写(一)
ps: 这两天研究unity3d,对动画处理特别迷糊,不知FBX导入以后,接下来应该怎么操作,看到这篇文章,感觉非常好,讲解的很详细. 已有好些天没写什么了,今天想起来该写点东西了.这次我所介绍的内容 ...
- 跟我一起学PCL打印语言(一)
引言 本人从事打印机开发和打印驱动开发的相关工作,深感资料特别是中文资料的匮乏和不成系统,对新入门的从事该行业的人来说,门槛很高.在这里一方面是将开发中遇到的相关知识点整理出来,另一方面也能够促进自己 ...
- Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
遇着这个提示的话,如果本地只安装了一个mysql,这里写的很详细的 http://www.blogjava.net/asenyifei/articles/82575.html 看这里可以解决,如果本地 ...