java算法:青蛙跳台阶问题(经典算法)

问题

  • 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

解决

1、动态规划
class Solution {
    public int numWays(int n) {
        // **3.动态规划**:穷举可以发现f(n)=f(n-1)+f(n-2);确定边界:f(0)=1,f(1)=1,f(2)=2;最佳解f(n)=f(n-1)+f(n-2);得到最终解决方案(边界+最优解)
        if(n==0) return 1;
        if(n<=2) return n;
        int a=1,b=1,c=2;
        int MOD=1000000007;
        for(int i=3;i<=n;i++){      //可以近似看作一个不断移动的数组,后面一个值等于前两个相加
            b=a;
            a=c;
            c=(a+b)%MOD;
        }                           
        return c;
    }
}
// 青蛙跳台阶:
// 递归、带备忘录的递归、动态规划

// **1.递归**
//   public int numWays(int n) {
//         if(n==0) return 1;
//         if(n==1) return 1;
//         if(n==2) return 2;
//         return numWays(n-1)+numWays(n-2);
// }


//**2. 带备忘的递归(减少了递归过程中的重复操作)**
    
    // HashMap<Integer,Integer> map=new HashMap();     //定义hashmap应该放在方法外面,在不方法每次调用都会创一个新的hashmap
    // public int numWays(int n) {
    //         if(n==0) return 1;
    //     if(n<=2) return n;
    //     int MOD=1000000007;
    //     if(map.containsKey(n))          //检查 hashMap 中是否存在指定的 key 对应的映射关系。
    //     {
    //         return map.get(n);       //如果备忘里存在就直接返回。
    //     }else{
    //         map.put(n,(numWays(n-1)+numWays(n-2))%MOD);
    //         return map.get(n);
    //     }
    //     // return numWays(n-1)+numWays(n-2);
    // }

总结

  • 时间复杂度分析:(1.递归)-O(n^2)---(2.带备忘的递归)-O(n)---(3.动态规划)-O(n)
  • 不管是递归还是带备忘录的递归都是至上而下的,而动态规划是至下而上;
  • 递归有大量的重复操作,而带备忘录的递归和动态规划每次操作都只执行一次,从而大大节省了时间
posted @   new_monkey  阅读(637)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示