剑指offer-JZ9

跳台阶扩展问题

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

c++
考查斐波那契数列的变种,
第n级 = f[n-1]+f[n-2]+......f[0]
三种思路:暴力、递归、 动态规划、
思路一,暴力法:

class Solution {
public:
    int jumpFloorII(int number) {
        if (number ==0 || number==1) return 1;
        vector<int> f(number+1, 0);
        f[0]=1; 
        f[1]=1;
        for (int i =2; i<=number; i++){
            for (int j=0; j<i; j++){
                f[i]=f[i]+f[j];
            }
        }
       return f[number];
    }                            
};

继续优化:
第n级

第n-1级
图片说明
所以:
图片说明
图片说明
继续有一下推论:图片说明
应该是图片说明
暴力法2:

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 0 || number == 1) return 1;
        int ans=1;
        for(int i=2; i<=number; i++){
            ans = ans << 1;
        }
        return ans;
    }
};

或者直接计算:

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 0 || number == 1) return 1;
        return pow(2,number-1);
    }
};

思路二,递归法:

class Solution {
public:
    int jumpFloorII(int number) {
        if (number ==0 || number ==1) return 1;
        int ans = 0;
        while(number>=0){
            number--;
            ans = ans + jumpFloorII(number);
        }
        return ans;

    }
};

这里需要重复计算,因此加入记忆,存储已经计算过的;

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

递归法2,利用推导公式:

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 0 || number == 1) return 1;
        return jumpFloorII(number-1)*2;
    }
};
全部评论

相关推荐

可爱的牛油果在求佛:再给你说一点,之前我的简历像流水账,当时我在面试的时候,面试官说:“你简历上的都是在调包吗?有自己的改进吗?如果没有改进直接调包的话,我觉得没什么可深挖的”。当时给我整懵了。其实大部分确实是在调包,因为我确实就用到这些简单的技术,如果只是把技术要点写在简历上,那没什么好说的,没意思,没什么深挖的。但是调包与调包之间仍存在区别,那就是自己的思考,如果你不把自己的困难摆出来,人家觉得就是简单的调包,有啥难的。其实只有你自己知道这个项目的难点在哪,只有你自己知道为什么要用这个技术,为什么要调这个包,而你需要展示的,不是技术,而是这个“为什么”,这是关键。所以,当你的技术不是很硬核的时候,就要突出自己的思考,这时候“思考”是难点,而当你的简历很硬核,技术很复杂时,技术本身就是难点。
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
08-10 12:43
临沂大学 Java
等闲_:1,换一个模版,这个模版没有人会看的 2,项目太烂大街了,也太简单了,找AI优化一下描述,项目可以烂大街,但是简历不能烂大街,或者找项目换一下 3,如果没什么奖的话,把学校放到下面,添加一个个人描述,简单些,让简历丰富一些 4,改完之后海投试试,但是我真的很建议别走java了,可以试试前端
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-12 14:25
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务