杨辉三角形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 ...
随机推荐
- 随记两个SHELL文本处理
1,对于AWK通配符的处理 例如文本: AAAAAAAA(CZ航母STYLE+CZ航母STYLE+CZ航母STYLE+CZ航母STYLE);XXXX;CCCCC(F22战机+F22战机);33333( ...
- IOS中TableView的使用(1) -创建一个简单的tableView
创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...
- windows phone开发-Webbrowser使用技巧
原文:windows phone开发-Webbrowser使用技巧 5月份开发了脸萌WP版,其中需要使用web技术来绘制图像,于是就使用了原生webbrowser控件.在使用webbrowser co ...
- AppiumDriver升级到2.0.0版本引发的问题--Cannot instantiate the type AppiumDriver
1. 问题描述和起因 在使用Appium1.7.0及其以下版本的时候,我们可以直接使用如下代码来创建一个AppiumDriver实例进行对安卓设备的操作. driver = new AndroidDr ...
- Phpstorm配置phpunit对php进行单元测试
在 phpstorm 中配置 php 项目的单元测试,项目使用 Composer 进行管理,为了避免在项目中直接引入 phpunit 相关代码包,使项目的 vendor 目录变得臃肿,这里采用全局安装 ...
- asterisk实时添加sip号码--sqlite篇
原文:asterisk实时添加sip号码--sqlite篇 asterisk实时添加sip号码--sqlite篇 今天尝试用了asterisk的实时模式,往sqlite里面添加一个sip帐号,无需重启 ...
- HTML 5 在Web SQL 使用演示样本
Web sql 这是一个模拟数据库浏览器.可以使用JS操作SQL完成数据读取和写入,但是这件事情并不多,现在支持的浏览器,而其W3C规格已经停止支持.外形似它的前景不是很亮. W3C 规范:http: ...
- 【转】【Android工具】被忽略的UI检视利器:Hierarchy Viewer
原文:http://blog.csdn.net/ddna/article/details/5527072 Hierarchy Viewer是随AndroidSDK发布的工具,位置在tools文件夹下, ...
- Linux Shell 示例精解(第七章 gawk编程)转载
第七章 gawk功能:gawk编程 7.1.1 数字和字符串常量 初始化和类型强制 在awk中,变量不需要定义就可以直接使用,使用一个变量就是对变量的定义.变量的类型可以试数字.字符串,或者 ...
- 查看mysql状态常用命令
最近服务器上mysql有些奇奇怪怪的问题,可惜我不是专业的dba,为了加深自己对mysql的了解,先从基础的查看mysql状态命令看起吧. 命令: show status; 命令: show stat ...