• 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 };
  • 相关阅读:
    分页通信
    减少页面加载时间的方法
    config/index.js
    5.20 单词小记
    nginx启动报错(1113: No mapping for the Unicode character exists in the target multi-byte code page)
    Windows系统下hosts文件工作原理(转)
    5.19 英语单词小计
    mybatis sql语句转化
    (转) Java 静态代码块和非静态代码块
    5.18英语单词小记
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4059976.html
Copyright © 2020-2023  润新知