剑指 Offer 10- II. 青蛙跳台阶问题 | 刷题打卡

163 阅读1分钟

1. 题目

2. 描述

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

**输入:**n = 2

**输出:**2

示例 2:

**输入:**n = 7

**输出:**21

示例 3:

**输入:**n = 0

**输出:**1

提示:

  • 0 <= n <= 100

3. 实现方法

3.1 方法 1

3.1.1 思路

  1. 递归
  2. 自己在草稿上模拟一遍,可以发现其实就是个斐波那契数列
  3. 所以可以很容易写出递归版本
  4. 此时时间辅助度为 O(2n)O(2^n)

3.1.2 实现

public int numWays(int n) {
	// 基础情况
    if(n <= 2){
        return n;
    }

    // 递归实现
    return (numWays(n - 1) + numWays(n - 2)) % 1000000007;
}

3.2 方法 2

3.2.1 思路

用一个 HashMap 来保存已经计算过的状态,然后每次从里边判断是否要计算该状态;

3.2.2 实现

static Map<Integer, Integer> map = new HashMap();
public int numWays(int n) {
    if(n <= 2){
        return n;
    }else{
        // 判断是否计算过,计算过就直接获取该值
        if(map.containsKey(n)){
            return map.get(n);
        }else{
            // 如果没有计算过,就加入该值并返回
            int tmp = numWays(n - 1) + numWays(n - 2) % 1000000007;
            map.put(n, tmp);
            return tmp;
        }
    }
}

3.3 方法 3

3.3.1 思路

  1. 利用递归实现很简单,但是时间复杂度太高,所以考虑用动态规划的方法
  2. 观察可以发现,其实当前状态只和前两个状态相关,所以定义两个状态 prevcurr 来前两个状态的值
  3. 然后然后不断切换两个状态值就可以得到最终结果
  4. 此时时间复杂度为 O(n)O(n)

3.3.2 实现

public int numWays(int n) {
    
    if(n == 1 || n == 0){
        return n;
    }

    int prev = 1;
    int curr = 1;

    for(int i = 2; i <= n; i++){
        int sum = (prev + curr) % 1000000007;
        prev = curr;
        curr = sum;
    }

    return curr;
}

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情