一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:
要求:时间复杂度: ,空间复杂度:
import functools class Solution: @functools.lru_cache def jumpFloor(self, number: int) -> int: # write code here if number <= 1: return 1 return self.jumpFloor(number - 1) + self.jumpFloor(number - 2)
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param number int整型 # @return int整型 # class Solution: def jumpFloor(self , number: int) -> int: if number < 2: return 1 s0, s1 = 1, 1 # 定义起始值 step = 2 while step < number: tmp = s0 s0 = s1 s1 = s1 + tmp step = step + 1 return s0 + s1
class Solution: def jumpFloor(self , number: int) -> int: # write code here if number==1:return 1 if number==2:return 2 a,b=1,2 for i in range(number-2): a,b=b,a+b return b
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param number int整型 # @return int整型 # 规律是斐波那契序列从第二个数开始的序列 class Solution: def jumpFloor(self , number: int) -> int: if number==2: return 2 elif number==1: return 1 else: # 递归 # return self.Fibonacci(n-1)+self.Fibonacci(n-2) start=[1,1] for _ in range(number-1): start.append(start[0]+start[1]) start.pop(0) return start[-1]
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param number int整型 # @return int整型 class Solution: def jumpFloor(self , number: int) -> int: ## 通过递归来实现 # write code here if number == 0: return 0 if number == 1: return 1 if number == 2: return 2 return self.jumpFloor(number-1) + self.jumpFloor(number-2) class Solution: def jumpFloor(self , number: int) -> int: ## 使用dp动态规划完成本题目 #### 当等于1时候,会有超出下标当情况,因此需要判断等于与1的情况 n = number dp = [0] * (n + 1) dp[0] = 0 dp[1] = 1 dp[2] = 2 for i in range(3, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] class Solution: def jumpFloor(self , number: int) -> int: ## 加入限制条件的动态规划 n = number dp = [0] * (n + 1) dp[0] = 0 dp[1] = 1 if n == 1: return dp[1] else: dp[2] = 2 for i in range(3, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n]
class Solution: dp = [1 for i in range(50)] def jumpFloor(self , number: int) -> int: for i in range(2, number+1): self.dp[i] = self.dp[i-1] + self.dp[i-2] return self.dp[number]
class Solution: def jumpFloor(self , number: int) -> int: a, b, c = 1, 1, 1 for i in range(2, number + 1): a = b b = c c = a + b return c
class Solution: def jumpFloor(self , number: int) -> int: # write code here def F(n,end=1): if n==end: return end return n*F(n-1,end) def Comb(m,n): if n==m or m==0: return 1 a = F(m) b = F(n,n-m+1) return int(b/a) n = number//2 s=0 for i in range(0,n+1): s+=Comb(i,number-2*i+i) return s
class Solution: # 递归备忘录,避免重复计算 dct = {} def jumpFloor(self, number: int) -> int: # 如果备忘录中保存了计算结果,就直接取 if number in self.dct.keys(): return self.dct[number] else: if number == 1: return 1 if number == 2: return 2 res = self.jumpFloor(number - 1) + self.jumpFloor(number - 2) self.dct[number] = res # 保存结果到备忘录 return res
对于本题,前提只有 一次 1阶或者2阶的跳法。
a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列:
| 1, (n=1)
f(n) = | 2, (n=2)