跳台阶 ----newcoder

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

newcoder 题目链接


以下为 2019.06.06 更新

class Solution {
public:
    int jumpFloor(int number) {
        /**
         * 首先明确青蛙的能力,他可以跳1级,可以跳两级
         * 好,接下来,我们来看看,青蛙怎么跳上5级台阶
         * 对5级台阶,它可以从4级台阶跳1步上来,
         *   也可以从3级台阶跳2步上来,我们不妨记为 f(5) = f(4) + f(3)
         * 对4级台阶,它可以从3级跳1步上来。也可以从2级跳1步上来 不妨记为 f(4) = f(3) + f(2)
         * 对3级台阶,它可以从2级台阶跳一步上来,也可以从1级台阶跳两步上来,f(3) = f(2) + f(1)
         * 对两级台阶,可以从1级跳1步上来,也可以直接调到2级,f(2) = 2;
         * f(1) = 1
         * 很完美的斐波那契数列
         */
        if (number <= 0)
        {
            return 0;
        }
        
        if(number == 1)
        {
            return 1;
        }
        
        if(number == 2)
        {
            return 2;
        }
        int f1 = 1;
        int f2 = 2;
        int f3 = 0;
        for(int i = 3; i <= number; ++i)
        {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        
        return f3;
    }
};

以上为 2019.06.06 更新
题解

台阶不应该为负数,但这是题目,万一有个负数测试用例呢,所以我们避免一下
如果台阶只有一级,那肯定只有一种方法
如果台阶有两级,就有两种办法,一次跳一步,和一步跳两级
如果有三级台阶,一次一步一步的跳可以,跳一步,再跳两步可以,跳两步再跳一步可以,只有这三种办法
我们再来分析一波,
假设现在6个台阶,
我们可以从第5跳一步到6,
这样的话有多少种方案跳到5就有多少种方案跳到6,
另外我们也可以从4跳两步跳到6,
跳到4有多少种方案的话,就有多少种方案跳到6

代码附上:
代码已上传 github,可用 git 工具下载查看:
github 代码链接,欢迎点击查看

/*
 *一只青蛙一次可以跳上1级台阶,也可以跳上2级。
 求该青蛙跳上一个n级的台阶总共有多少种跳法
 (先后次序不同算不同的结果)。
 * */

class Solution {
public:
    int jumpFloor(int number) {
        // 台阶数肯定不为负,就不考虑负数情况了
        // 如果只有一个台阶 只有跳一步一种方法
        // 如果有两个台阶,可以跳两次一步,也可以一次跳两步
        // 就有两种方法
        // 这两种情况很简单
        // 我们先对这两种情况处理
        int res[3] = {0, 1, 2};
        if(number < 3)
        {
            return res[number];
        }

        // 接下来我们考虑多个台阶的情况
        /*假设现在6个台阶,
         * 我们可以从第5跳一步到6,
         * 这样的话有多少种方案跳到5就有多少种方案跳到6,
         * 另外我们也可以从4跳两步跳到6,
         * 跳到4有多少种方案的话,就有多少种方案跳到6*/
        // 这就是一种转化的思想
        int first = 1; 
        int second = 2;
        int third = 0;
        for(int i = 3; i <= number; ++i)
        {
            third = first + second;
            first = second;
            second = third;
        }

        return third;
    }

};

接下来我们看一道同类型的题,也是跳台阶:
题目描述

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

newcoder 题目链接


以上为 2019.06.06 更新

class Solution {
public:
    int jumpFloorII(int number) {
        if(number <= 0)
        {
            return 0;
        }

        // 对一个n级台阶来说
        // 第一步有 n 种跳法
        // 跳一级,剩下 n-1 步的跳法为jumpFloorII(n-1) 
        // 跳两级,剩下 n-2 步的跳法为jumpFloorII(n-2)
        // 所以 jumpFloorII(n) = jumpFloorII(n-1)+jumpFloorII(n-2) + ...+ jumpFloorII(1)
        // 又有 jumpFloorII(n-1) = jumpFloorII(n-2) + ...+ jumpFloorII(1)
        // 所以 jumpFloorII(n) = 2 * f(n-1);
        // 若 n=1 jumpFloorII(1) = 1;
        // 若 n=2 jumpFloorII(2) = 2*jumpFloorII(1) = 2;
        // 若 n=3 jumpFloorII(3) = 2*jumpFloorII(2) = 4;
        // 
        // 若 n=n jumpFloorII(n) = 2^(n-1);
        int steps = 1;
        for(int i = 1; i < number; ++i)
        {
            steps *= 2;
        }
        
        return steps;
    }
};

以上为 2016.06.06 更新

题解

乍一看这题和上一题一样,好像复杂了一点点,上一道题每次只能跳一步或者跳两步,二这道题,一次可以跳n步,那我们来缕缕:
对一个n级台阶来说
第一步有 n 种跳法
跳一级,剩下 n-1 步的跳法为jumpFloorII(n-1)
跳两级,剩下 n-2 步的跳法为jumpFloorII(n-2)
所以 jumpFloorII(n) = jumpFloorII(n-1)+jumpFloorII(n-2) + …+ jumpFloorII(1)
又有 jumpFloorII(n-1) = jumpFloorII(n-2) + …+ jumpFloorII(1)
所以 jumpFloorII(n) = 2 * f(n-1);
若 n=1 jumpFloorII(1) = 1;
若 n=2 jumpFloorII(2) = 2 * jumpFloorII(1) = 2;
若 n=3 jumpFloorII(3) = 2 * jumpFloorII(2) = 4;
若 n=n jumpFloorII(n) = 2^(n-1);
缕完了之后我们发现题目貌似简单了

接下来代码附上;
同样有 github 链接哟,欢迎查看:
gitbub 代码链接,欢迎点击查看

class Solution {
public:
    int jumpFloorII(int number) {
        if(number <= 0)
        {
            return 0;
        }

        // 对一个n级台阶来说
        // 第一步有 n 种跳法
        // 跳一级,剩下 n-1 步的跳法为jumpFloorII(n-1) 
        // 跳两级,剩下 n-2 步的跳法为jumpFloorII(n-2)
        // 所以 jumpFloorII(n) = jumpFloorII(n-1)+jumpFloorII(n-2) + ...+ jumpFloorII(1)
        // 又有 jumpFloorII(n-1) = jumpFloorII(n-2) + ...+ jumpFloorII(1)
        // 所以 jumpFloorII(n) = 2 * f(n-1);
        // 若 n=1 jumpFloorII(1) = 1;
        // 若 n=2 jumpFloorII(2) = 2*jumpFloorII(1) = 2;
        // 若 n=3 jumpFloorII(3) = 2*jumpFloorII(2) = 4;
        // 
        // 若 n=n jumpFloorII(n) = 2^(n-1);
        int steps = 1;
        for(int i = 1; i < number; ++i)
        {
            steps *= 2;
        }
        
        return steps;
    }
};

有什么问题欢迎留言,有更好的解法还请不吝赐教,好好学习,共同进步 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值