算法(爬楼梯,斐波那契数,第 N 个泰波那契数)

此专栏就会写一些leetcode上面的算法题,放上一些自己的理解。

1.70. 爬楼梯爬楼梯

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例1:

输入:n = 2
输出:2

示例2:

输入:n = 3
输出:3

分析:此题很明显就是动态规划问题,于是我们可以将它分为两个问题,爬楼梯的数量可以分为两个部分,第一个部分为只剩一阶的方法(n-1),第二个部分为只剩两阶的方法(n-2),所以总数=(n-1)+(n-2),然后因为已知0和1阶的时候方法为1,这样就可以优化算法,得到以下代码。

class Solution {
    public int climbStairs(int n) {
        int[] p=new int[n+1];
        p[0]=1;
        p[1]=1;
        for(int i=2;i<=n;i++){
            p[i]=p[i-1]+p[i-2];
        }
        return p[n];
    }
}

        此题其实也就是斐波那契数列,还可以使用公式解决(虽然我背不下来):

class Solution {
    public int climbStairs(int n) {
        double sqrt_5 = Math.sqrt(5);
        double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);
        return (int)(fib_n / sqrt_5);
    }
}

作者:guanpengchn
链接:https://leetcode.cn/problems/climbing-stairs/solution/hua-jie-suan-fa-70-pa-lou-ti-by-guanpengchn/

2.509. 斐波那契数斐波那契数

题目:

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

分析:很容易知道,F(n)=F(n−1)+F(n−2),所以我们直接根据已知的F(0) = 0,F(1) = 1,就直接可以写出代码。

class Solution {
    public int fib(int n) {
int a=0;
        if(n<2){
            a=n;
        }else{
            a=fib(n-1)+fib(n-2);
        }
        return a;
}
}

但是,显而易见,这样时间复杂度,空间复杂度很高:

所以,我们应该要将代码优化:

class Solution {
    public int fib(int n) {
        int m=0;
        int a=0,b=0,c=1;
        if (n<2){
            m=n;
        }else{
            for (int i = 2; i <= n; i++) {
                a=b;
                b=c;
                c=a+b;
            }
            m=c;
        }
        return m;
}
}

 最终:

3,1137,第 N 个泰波那契数 

题目:

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

分析:此题和上面第二题类似,只是刚刚是F(n)=F(n−1)+F(n−2),现在需要F(n)=F(n−1)+F(n−2)+...+F(1)+F(0);但是,思想是一样的,代码:

class Solution {
    public int tribonacci(int n) {
        if (n ==0) {
         return 0;
         }
         if (n <=2) {
         return 1;
         }
         int a=0,b=0,c=1,d=1;
         for (int i = 3; i <=n; i++) {
         a=b;
         b=c;
         c=d;
         d=a+b+c;
         }
         return d;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会Java的MING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值