Pascal's Triangle II

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 };

 

posted on 2014-10-29 17:01  luckygxf  阅读(235)  评论(0编辑  收藏  举报

导航