题目链接:https://leetcode.com/problems/pascals-triangle-ii/
Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1]
.
Note:
Could you optimize your algorithm to use only O(k) extra space?
思路:本题是返回杨辉三角的一行,根据杨辉三角的性质可以知道,一行的值是对称的,并且为
C(n,0), C(n, 1), C(n, 2), C(n, 3),.... , C(n, n-1), C(n, n)
由于对称,所以只需要计算一半。
C(n, 0) = 1
C(n, 1) = n/1
C(n, 2) = n*(n-1)/(1*2)
C(n, 3) = n*(n-1)(n-2)/(1*2*3)
....
因此可以得出规律,每一项分子增加一个数,分母增加一个数,即可直接产生出一行的每一个数。
但是要注意有个坑,就是分子有可能乘积整型溢出,因此可以让分母为long型,就会将结果自动转型为long,这样就不会溢出了。
long int在64位机器上是8字节,32位机器是4字节,因此leetcode的后台估计是64位的吧。
时间复杂度为O(n), 不需要额外的空间
代码如下:
class Solution { public: vector<int> getRow(int rowIndex) { vector<int> result; result.resize(rowIndex + 1); result[0] = result[rowIndex] = 1; for(long int i =1; i<= rowIndex/2; i++) result[i] = result[rowIndex - i] = result[i-1] * (rowIndex - i + 1)/i; return result; } };