题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶?
思路:分为两种情况,最后一步爬1个台阶或者最后一步爬2个台阶,二者之和即为所有的可能的方法。首先想到了递归算法,很不幸的是当n=38时就已经超时了。另外两种方法,斐波拉契数列以及动态规划法。
思路一:动态规划法
初始化dp[0]=0,dp[1]=1.dp[n]=dp[n-1]+dp[n-2]
1 class Solution: 2 def climbStairs(self, n: int) -> int: 3 if n == 1: 4 return 1 5 dp = [1,2] #初始化 6 for i in range(3,n+1): 7 temp = dp[-1]+dp[-2] 8 dp.append(temp) 9 dp.pop(0) #为了减少内存开销,使数组大小始终为2,故每次弹出栈顶元素 10 return dp[-1]
思路二:斐波拉契数列法。
1 class Solution: 2 def climbStairs(self, n: int) -> int: 3 if n == 1 or n == 2: 4 return n 5 f_1 = 1 6 f_2 = 2 7 for i in range(3,n+1): 8 f_n = f_1 + f_2 9 f_1 = f_2 10 f_2 = f_n 11 return f_n 12 13 #公式法 14 class Solution: 15 def climbStairs(self, n: int) -> int: 16 sqrt5 = math.sqrt(5) 17 fib = math.pow((1+sqrt5)/2,n+1)-math.pow((1-sqrt5)/2,n+1) 18 return int(fib/sqrt5)
原文地址:https://www.cnblogs.com/shawn-young/p/12636600.html
时间: 2024-10-29 22:30:43