斐波那契数列/跳台阶进阶问题

何为斐波那契数列,简单来说,就是F(n)=F(n-1)+F(n-2),斐波那契数列可应用于多个场景,比如说跳台阶问题

斐波那契数列简单题:

 递归上去,啪就是一个超时,还是得用迭代

class Solution {
    public int fib(int n) {
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        if(n==2){
            return 1;
        }
        return (fib(n-1)+fib(n-2))>1000000007?1:fib(n-1)+fib(n-2);

    }
}

不超时的朴素做法

class Solution {
    public int fib(int n) {
        final int MOD = 1000000007;
        if (n < 2) {
            return n;
        }
        int p = 0, q = 0, r = 1;
        for (int i = 2; i <= n; ++i) {
            p = q; 
            q = r; 
            r = (p + q) % MOD;
        }
        return r;
    }
}

跳台阶问题,类似于斐波那契数列,台阶可以一次跳一层或者两层,问跳n层台阶有几种方法。

倒着推,跳上最后一级台阶需要跳一步或两步,即F(n)=F(n-1)+F(n-2),具体解法见代码,基本与求解斐波那契数列F(n)的方法一致

class Solution {
    public int numWays(int n) {
        final int MOD = 1000000007;
       if(n==0){
           return 1;
       }
        if (n==1) {
            return 1;
        }
        int p = 0, q = 1, r = 1;
        for (int i = 2; i <= n; i++) {
            p = q; 
            q = r; 
            r = (p + q) % MOD;
        }
        return r;
    }
}

跳台阶进阶问题,即在特定的条件下才能够跳两步,即不符合条件时F(n)=F(n-1),

符合条件时F(n)=F(n-1)+F(n-2),详见具体题目

 这时候需要判定条件,看能不能跳两步

class Solution {
    public int translateNum(int num) {
        // 预处理
        char[] chs = String.valueOf(num).toCharArray();
        int len = chs.length;
        // 到i结尾的字符串的翻译方法数量
        int [] dp = new int [len];
        // 首项是1
        dp[0] = 1;
        for (int i = 1; i < len; ++i) {
            // 第一种翻译方法 
            dp[i] = dp[i - 1];
            // 第二种翻译方法 检查临近的两位是否['10', '25']之间
            if (chs[i - 1] == '1' || chs[i - 1] == '2' && chs[i] <= '5')
                dp[i] += ((i - 2 < 0) ? 1 : dp[i - 2]); // 若不能继承 就设为1 否则继承dp[i-2]
        }
        return dp[len - 1];
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值