一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:
要求:时间复杂度: ,空间复杂度:
class Solution: cache ={} def jumpFloor(self , number: int) -> int: if number == 1: self.cache[number] = 1 return 1 if number == 2: self.cache[number] = 2 return 2 # 第一步走一步 if number-1 not in self.cache.keys(): x = self.jumpFloor(number-1)*1 else: x = self.cache[number-1] # 第一步走两步 if number-2 not in self.cache.keys(): y = self.jumpFloor(number-2)*1 else: y = self.cache[number-2] self.cache[number] = x+y return x+y; # write code here
class Solution: def jumpFloor(self, number): # write code here if number <= 2: return number a = [1, 2] for i in range(2, number): a.append(a[-1] + a[-2]) return a[-1]
class Solution: def jumpFloor(self, number): if number < 2: return number if number == 2: return 2 res = [1, 1] if number > 2: for i in range(number): res.append(res[-1] + res[-2]) return res[number]
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): def jiecheng(n): m=1 for i in range(n): m=m*(i+1) return m tjsl2=0 tjsl1=0 solu=0 for i in range(int(number/2)+1): tjsl2=i tjsl1=number-2*i solu=solu+jiecheng(tjsl1+tjsl2)/(jiecheng(tjsl1)*jiecheng(tjsl2)) return solu # write code here笨比的排列组合解法
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here res=[0,1,2,3] if number<=3: return res[number] else: for i in range(4,number+1): res.append(res[i-1]+res[i-2]) return res[number]
class Solution: def jumpFloor(self, number): # write code here a = b = res = 1 for i in range(number-1): res = a + b a = b b = res return res
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.dp = [0] * 1001 def jumpFloor(self, number): if number < 0: return -1 if number <= 2: return number if self.dp[number - 1] == 0: self.dp[number - 1] = self.jumpFloor(number - 1) if self.dp[number - 2] == 0: self.dp[number - 2] = self.jumpFloor(number - 2) return self.dp[number - 1] + self.dp[number - 2]
# -*- coding:utf-8 -*- def Combinatorial(n,i): Min=min(i,n-i) result=1 for j in range(0,Min): result=result*(n-j)/(Min-j) return result class Solution: def jumpFloor(self, number): # write code here number2=0 count=0 while number2*2<=number: number1=number-number2*2 count=count+Combinatorial(number1+number2,number1) number2=number2+1 return count
import numpy as np class Solution: def jumpFloor(self, number): path=[[0]] n_count=0 for i in path: if sum(i)>=number-1: n_count=n_count+1 else: tmp=i.copy() tmp.append(1) path.append(tmp) tmp = i.copy() tmp.append(2) path.append(tmp) return n_count def jumpFloor2(self, number): if number<=1: return 1 else: return self.jumpFloor(number-2)+self.jumpFloor(number-1) def jumpFloor1(self, number): path=[[0]] steps=iter(path) #next(steps) n_count=0 try: while True: step=next(steps) if sum(step)>=number-1: n_count=n_count+1 else: tmp=copy.copy(step) tmp.append(1) path.append(tmp) tmp = copy.copy(step) tmp.append(2) path.append(tmp) #next(step) except: pass finally: return n_count大家看看,是否有问题
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here array = [0,1,2] if number < 3: return array[number] for i in range(3,number+1): array.append(array[i-2]+array[i-1]) return array[number]
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here array = [0,1,2] if number < 3: return array[number] for i in range(3,number+1): array.append(array[i-2]+array[i-1]) return array[number] if __name__ == "__main__": a = Solution() print(a.jumpFloor(5))
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here array = [0,1,2] if number == 0: return [array[0]] if number == 1: return [array[0],array[1]] if number == 2: return array for i in range(3,number+1): array.append(array[i-2]+array[i-1]) return array if __name__ == "__main__": a = Solution() print(a.jumpFloor(2))
class Solution: def jumpFloor1(self, number, res): if number <= 1: return 1 elif res[number] != -1: return res[number] else: res[number] = self.jumpFloor1(number - 1, res) + self.jumpFloor1(number - 2, res) return res[number] def jumpFloor(self, number): res = [-1] * (number + 1) return self.jumpFloor1(number, res)
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解决跳台阶问题,为了方便理解和观察出规律,我们先自己点出n=1,2,3,4,5时所对应的规律:
如何计算跳法呢?
简单来说,就是不断采用每次跳1级,还是跳2级来组合,所有可能的组合都是一种跳法。
总结上面分析的跳台阶的规律:
f(1)=1
f(2)=2
f(3)=3, f(3)=f(1)+f(2)
f(4)=5, f(4)=f(2)+f(3)
f(5)=8, f(5)=f(3)+f(4)
......
得出它们的通项公式如下:
由通项公式来看,这是一个典型的递归求解问题,简单粗暴来讲,递归就是不断依靠之前的函数值来运算得到当前值的过程。
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here # ----------------------------- # 增加代码鲁棒性 if number == 1: return 1 if number == 2: return 2 # ----------------------------- # 实际应用 fone,ftwo,total=1,2,0 for i in range(3,number+1): # 观察规律 #f(1)=1 #f(2)=2 #f(3)=3, f(3)=f(1)+f(2) #f(4)=5, f(4)=f(2)+f(3) #f(5)=8, f(5)=f(3)+f(4) # ...... total=fone+ftwo fone,ftwo=ftwo,total # 不断更新前一项、前前一项的值 return total
对于本题,前提只有 一次 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)