剑指offer-JZ8

跳台阶

https://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&tqId=11161&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tab=answerKey

C++
本题是斐波那契数列的变种;
第n级台阶有两种跳法: 从n-1级跳1级 + 从n-2级跳2级;
因此 f[n]=f[n-1] + f[n-2];
推知:
n=0-------1
n=1-------1
n=2-------f[0]+f[1]=2;
三种方法:
动态规划、递归、直接数组保存(但这里未说明n范围,担心会超时)---参考JZ7
1动态规划:

class Solution {
public:
    int jumpFloor(int number) {
        int tmp0=1, tmp1=1, ans;
        if (number ==0 || number == 1) return 1;
        for (int i=1; i<number; i++){
            ans = tmp0 + tmp1;
            tmp0 = tmp1;
            tmp1 = ans;
        }
        return ans;
    }
};

2-递归

public:
    int jumpFloor(int number) {
        if (number==0 || number==1) return 1;
        return jumpFloor(number-1)+jumpFloor(number-2);
    }
};

加入优化

class Solution {
public:
    int Fib(int n, vector<int> &dp){
        if (n==0 || n==1) return 1;
        if (dp[n] != -1) return dp[n] ;
        return dp[n]=Fib(n-1, dp) + Fib(n-2,dp);
    }
    int jumpFloor(int number) {
        vector<int> dp(number+1, -1);
        return Fib(number, dp);
    }
};

3-利用数组,这里默认1000,其实是不合理的

class Solution {
public:
    int jumpFloor(int number) {
        int f[1000] = {0};
        f[0]=1;
        f[1]=1;
        for(int i=2; i<number+1; i++){
            f[i]=f[i-1]+f[i-2];
        }
        return f[number];
    }
};
全部评论

相关推荐

头像
04-26 15:05
已编辑
腾讯_后端开发
小红书 iOS社区技术 年薪52w+包三餐大小周
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务