每日LeetCode-02

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1

F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

来源:力扣(LeetCode)

题解

这道题其实最传统的做法就是使用递归,但是我们知道,若递归深度过大,就会导致栈溢出

为了解决该问题,我们可以使用动态规划,将每次前两数之和存起来,便于下次直接使用,这样子,我们就把一个栈溢出的问题,变为了单纯的数学加法,大大减少了内存的压力

来源:力扣(LeetCode)

JS

var fib = function(n) {

    let n1 = 0, n2 = 1, sum;

    for(let i = 0; i < n; i++){

        sum = (n1 + n2) % 1000000007;

        n1 = n2;

        n2 = sum;

    }

    return n1;

};



python

class Solution:

    def fib(self, n: int) -> int:

        a, b = 0, 1

        for _ in range(n):

            a, b = b, a + b

        return a % 1000000007



一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法

1.使用斐波那契数列解决,推出结果f(n)=f(n-1)+f(n-2)

2.矩阵快速幂 深入思考 适合数学好的朋友看

C++

typedef long long ll;

class Solution {

private:

    struct Matrix{

        const static int N=2;

        const static ll MOD=1e9+7;

        ll a[N][N];

        Matrix(bool x){for(int i=0;i<N;i++)for(int j=0;j<N;j++)a[i][j]=x?i==j:0;}

        Matrix operator*(Matrix&b){

            Matrix C=Matrix(0);

            for(int k=0;k<N;k++)

                for(int i=0;i<N;i++)

                    for(int j=0;j<N;j++)

                        C.a[i][j]=(C.a[i][j]+a[i][k]*b.a[k][j])%MOD;

            return C;

        }

        Matrix operator^(int n){

            Matrix C=Matrix(1);

            Matrix A=Matrix(0);

            for(int i=0;i<N;i++)for(int j=0;j<N;j++)A.a[i][j]=a[i][j];

            for(;n;n>>=1,A=A*A)if(n&1)C=C*A;

            return C;

        }

        void show(){puts("");for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<a[i][j]<<" ";puts("");}}

    };

public:

    int numWays(int n) {

        Matrix A0=Matrix(0);

        A0.a[0][0]=1,A0.a[0][1]=1;

        A0.a[1][0]=0,A0.a[1][1]=0;

        //A0.show();

        Matrix B=Matrix(0);

        B.a[0][0]=0,B.a[0][1]=1;

        B.a[1][0]=1,B.a[1][1]=1;

        //B.show();

        Matrix C=B^n;

        //C=A0*C;

        //C.show();       

        return (A0*C).a[0][0];

    }

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容