https://oj.leetcode.com/problems/pascals-triangle-ii/
Pascal's 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?
这是一个帕斯卡三角,即杨辉三角的题。
// 1 第0行
// 1 1 第1行
// 1 2 1 第2行
// 1 3 3 1 .
//... .
这里主要求第n行的那几个数,如第2行[1, 2, 1],这里我百度了一下,可以抽象为(a + b)^n的二项式系数。即如果是求第n行的系数可以求(a + b) ^ n的二项式系数。结果为[C(n,0), C(n,1)...C(n, n)]
由于前面C(n,0)...C(n,n/2)和后面C(n, n/2)...C(n/2, n)是中心对称的,只要求前面的就好了。
问题来了,如何求C(n, r)
有数学公式C(n,r) = A(n,r)/A(r,r) = n * (n - 1) *...(n - m + 1)/ r!
或者C(n, r) = n!/(r! * (n - r)!)
ps:A(n,m) = n * (n - 1) *...(n - m + 1) = A(n,n)/A(n - m) = n!/(n - m)!
这里我开始用第二个公式,明显出现Int溢出问题,到10多的时候就溢出。
这里到网上找了一下大数相乘问题,用了个比较简单的BigInteger类,可以查看一下java api。但是网上很多用数组模拟的,这个还是要好好学学
还没看讨论区的,贴完代码看看去
//这里的帕斯卡三角即杨辉三角 // 1 // 1 1 // 1 2 1 // 1 3 3 1 //这里可以转换成(a + b) ^ n的二项式系数来求解 //index 即为这里的n //需要用到组合公式C(n,m) = n! / (m! * (n - m)!) = n(n - 1)...(n - m + 1)/m! //rowIndex 为第几行 从第0行开始 public class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> set = new ArrayList<Integer>(); for(int i = 0; i <= rowIndex / 2; i++){ Integer element = getElment(rowIndex, i); set.add(element); } if(1 == (rowIndex % 2)){ Integer element = set.get(rowIndex / 2); set.add(element); } for(int i = rowIndex / 2 - 1; i >= 0; i--){ Integer element = set.get(i); set.add(element); } return set; } //得到第r项的二项式系数 //C(n,r)的值 // public int getElment(int n,int r){ int result = 0; //先计算n!、r!和(n - r)! BigInteger factorial_n = BigInteger.valueOf(1); BigInteger factorial_r = BigInteger.valueOf(1); for(int i = n; i >= n - r + 1; i--){ factorial_n = factorial_n.multiply(BigInteger.valueOf(i)); } for(int i = r; i > 1;i--){ factorial_r = factorial_r.multiply(BigInteger.valueOf(i)); } result = factorial_n.divide(factorial_r).intValue(); return result; }
大数相乘、BigInteger类还要好好看看
ps:在discuss区看到有个用c++ vector实现的很简单
第一次将生成1
每一次都在前面插入一个1在j = 1 vector[j] = vector[j] + vector[j + 1]一直到最后一个1前面一个元素结束
1 #include <vector> 2 using namespace std; 3 class Solution { 4 public: 5 vector<int> getRow(int rowIndex) { 6 vector<int> result(1,1); 7 for(int i=1;i<=rowIndex;i++){ 8 result.insert(result.begin(),1); 9 for(int j=1;j<result.size()-1;j++){ 10 result[j] = result[j] + result[j+1]; 11 } 12 } 13 return result; 14 } 15 };