509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
此题可以使用递归方法求解;递归公式已经给出。
class Solution:
def fib(self, n: int) -> int:
if(n<2):
return n
else:
return self.fib(n-1)+self.fib(n-2)
但是,画出二叉树可见,每一个N下面都有两个子节点,时间复杂度为O(2^n),很容易超时,于是我们用动态规划的思想进行改进。
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
else:
dp=[0]*(n+1)
dp[0]=0
dp[1]=1
for i in range(2,n+1):
dp[i]=dp[i-1]+dp[i-2]
return dp[n]
以上代码事件复杂度为O(n)。
以上两个算法空间复杂度为O(n),研究一下发现,事实上只需要两个数值,空间复杂度为O(1)。
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
dp=[0]*2
dp[0]=0
dp[1]=1
for i in range(2,n+1):
temp=dp[0]+dp[1]
dp[0]=dp[1]
dp[1]=temp
return dp[1]
70. 爬楼梯
class Solution:
def climbStairs(self, n: int) -> int:
dp=[0]*(n+1)
dp[0]=1
dp[1]=1
i=2
while (i<=n):
dp[i]=dp[i-1]+dp[i-2]
i+=1
return dp[n]
思想和上面的斐波那契数差不多。