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 }