8 跳台阶

题目描述

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

跳台阶是一个经典的问题,可以用递归或动态规划的方法来解决。假设有 n 级台阶,每次可以跳 1 级或 2 级,求跳上这个台阶的不同跳法总数。

使用递归的方法可以表示为:

func jumpFloor(n int) int {
    if n <= 2 {
        return n
    }
    return jumpFloor(n-1) + jumpFloor(n-2)
}

使用动态规划的方法可以表示为:

func jumpFloor(n int) int {
    if n <= 2 {
        return n
    }

    dp := make([]int, n+1)
    dp[1] = 1
    dp[2] = 2

    for i := 3; i <= n; i++ {
        dp[i] = dp[i-1] + dp[i-2]
    }

    return dp[n]
}

以上两种方法都能得到跳上 n 级台阶的总跳法数,它们的时间复杂度都是 O(n),空间复杂度也是 O(n)。如果对空间复杂度有要求,还可以进一步优化,只保留最近的两个状态即可, 这种优化后的方法的空间复杂度为 O(1)。例如:

func jumpFloor(n int) int {
    if n <= 2 {
        return n
    }

    a, b := 1, 2
    for i := 3; i <= n; i++ {
        a, b = b, a+b
    }

    return b
}

  

 

 

posted @ 2021-04-07 22:04  zqlucky  阅读(73)  评论(0编辑  收藏  举报