青蛙跳台阶

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

思路:

  1. 如果只有1级台阶,那显然只有一种跳法 。
  2. 如果有2级台阶,那么就有2种跳法,一种是分2次跳。每次跳1级,另一种就是一次跳2级。
  3. 如果台阶级数大于2,设为n的话,这时我们把n级台阶时的跳法看成n的函数,记为 f(n)。
  4. 第一次跳的时候有2种不同的选择:一是最后一次跳一级,此时跳法的数目等于前面剩下的n-1级台阶的跳法数目,即为f(n - 1)。
  5. 二是最后一次跳两级,此时跳法的数目等于前面剩下的n-2级台阶的跳法数目,即为f(n - 2),因此n级台阶的不同跳法的总数为f(n - 1) + f(n - 2)。

最终我们得到如下的递推式:f(n) = f(n - 1) + f(n - 2)
在这里插入图片描述
这个递推式和 斐波那契数列 比较相似,这里就简单写常用的两种实现方式。

代码:

递推:时间复杂度O(2^n)
public class Solution {
    public int JumpFloor(int target) {
        if(target == 1){
            return 1;
        }
        if(target == 2){
            return 2;
        }
        return JumpFloor(target - 1) + JumpFloor(target - 2);
    }
}
自底向上型循环:时间复杂度为O(n)
public class Solution {
    public int JumpFloor(int target) {
        int a = 1, b = 1;
        for (int i = 1; i < target; i++) {
            a = a + b;
            b = a - b;
        }
        return a;
    }
}

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

思路:
设 n级台阶 有 f (n) 种跳法,根据最后一次跳台阶的数目可以分解为最后一次一级,则前面需要跳 n - 1 级,有 f (n - 1) 种跳法;最后一次跳两级,则前面需要跳 n-2级,有 f (n - 2) 种跳法。

以此类推 易知  
f(n) = f(n - 1) + f(n - 2) + …… +f (0)
f(n - 1) = f(n - 2) + …… +f (0)
两式相减得
f(n) = 2f(n-1)

代码:

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 1){
            return 1;
        }
        return 2*JumpFloorII(target-1);
    }
}

展开阅读全文

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

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读