题解
典型的斐波那契数列问题,可使用递归算法,复杂度太高,这里不做介绍。
仅介绍动态规划和公式法
动态规划
-
初试化 d p = [ 0 , . . . , 0 ] dp=[0,...,0] dp=[0,...,0],长度为 n + 1 n+1 n+1。
-
若 n < 2 n<2 n<2,返回 1 1 1
-
初始化 d p [ 1 ] = 1 , d p [ 2 ] = 2 dp[1]=1,dp[2]=2 dp[1]=1,dp[2]=2
-
遍历,遍历区间 [ 3 , n + 1 ) [3,n+1) [3,n+1):
- d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i]=dp[i-1]+dp[i-2] dp[i]=dp[i−1]+dp[i−2],即当前层的方法数等于前一阶的方法数加上前两阶的方法数。
-
返回 d p [ n ] dp[n] dp[n]
复杂度分析
- 时间复杂度: O ( n ) O\left(n\right) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
Python
class Solution:
def climbStairs(self, n: int) -> int:
dp=[0]*(n+1)
dp[1]=1
if(n<2):
return dp[n]
dp[2]=2
for i in range(3,n+1):
dp[i]=dp[i-1]+dp[i-2]
return dp[n]
Java(待完成)
公式
斐波那契公式的应用
第
n
n
n个斐波那契数的公式:
F
n
=
1
/
5
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
F_{n}=1 / \sqrt{5}\left[\left(\frac{1+\sqrt{5}}{2}\right)^{n}-\left(\frac{1-\sqrt{5}}{2}\right)^{n}\right]
Fn=1/5[(21+5)n−(21−5)n]
复杂度分析
- 时间复杂度: O ( l o g ( n ) ) O\left(log(n)\right) O(log(n))
- 空间复杂度: O ( 1 ) O(1) O(1)
Python
class Solution:
def climbStairs(self, n: int) -> int:
import math
sqrt5=5**0.5
fibin=math.pow((1+sqrt5)/2,n+1)-math.pow((1-sqrt5)/2,n+1)
return int(fibin/sqrt5)