青蛙跳台阶(斐波那契数列)

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

思路一:递归

int JumpFloor(int n) {
    if(n==1)
            return 1;
        else if(n==2)
            return 2;
        return JumpFloor(n-1)+JumpFloor(n-2);
    }
代码看似很简洁,实际上运行效果很低效,因为子问题大规模重合,导致非常多的重复计算。

思路二:动态规划

对思路一的递归进行优化,引入一个记录memo,凡是计算过的子问题直接存入memo,下次计算时直接读取。

int JumpFloor(int n) {
        vector<int> memo(n+1);//vector会自动初始化为0
        return anx(n,memo);
    }
    int anx(int n,vector<int>& memo){
        if(n==1) return 1;
        if(n==2) return 2;
        if(memo[n]!=0) return memo[n]; //memo中已有的子问题,直接读取答案
        int ans=anx(n-1,memo)+anx(n-2,memo);
        memo[n]=ans;//memo中没有的子问题,将计算结果存入memo
        return ans;
    }

思路三:循环

int JumpFloor(int n) {
        int pre=0,res=1,tmp;
        while(n--){
            tmp=res;
            res+=pre;
            pre=tmp;
        }
        return res;
    }

该算法既简洁又高效。


三个算法的测试用时(n=40)
算法测试用时(ms)
递归3707
动态规划1
循环0

阅读更多
个人分类: LeetCode
上一篇内存的清除与复制
下一篇变态跳台阶(2的幂次方)(一行代码解决)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭