春招打卡|青蛙跳台阶

106 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

输入:n = 2 输出:2

二、思路分析

  1. 青蛙跳台阶问题,实质上与菲波那切数列的做法一直,创建要计算到第n个跳法,只需要计算f(n-1)和f(n-2)有多少种跳法,青蛙到第n个台阶,要么是从n-1跳上来,要么是从n-2位置跳上来。
  2. 第一种做法是开启一个n+1长的dp数组,dp[0] = 1dp[1] = 1,从2开始遍历。转移方程为dp[i] = dp[i-1] + dp[i-2],最后返回dp(n),即到达n的所有跳法。
  3. 在前面dp数组的基础上进行优化,空间上可以更优,优于每次dp[i]的增加只涉及到数组中前两个元素,可以将这两个元素分别表示为a,b,令a,b =1,左侧滑动,即 b = a+b,a = b,可以使得空间复杂度更优。

三、AC 代码

dp数组

func numWays(n int) int {
    mod := int(1e9 + 7)
    if n == 0 {
        return 1
    }
    dp := make([]int,n+1)
    dp[0],dp[1] =1,1
    for i := 2 ;i<=n ;i++ {
        dp[i] = (dp[i-1] + dp[i-2]) % mod
    }
    return dp[n]
}

空间优化

func numWays(n int) int {
    mod := int(1e9 + 7)
    if n == 0 {
        return 1
    }
    a,b := 1,1
    for i := 2 ;i<=n ;i++ {
        a,b = b,(a+b)%mod
    }

    return b
}

四、总结

本题需要注意的地方是,每次增加需要将a+b的结果对mod取余数,mod为1e9+7。