跳台阶是斐波那契数列的一个典型应用,其思路如下:
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.value=[0]*50 def jumpFloor(self, number): # write code here self.value[0]=1 self.value[1]=2 for i in range(2,number): self.value[i]=self.value[i-1]+self.value[i-2] return self.value[number-1]
这里为了避免递归的低效率,采用数组遍历的方式。 时间复杂度依旧为O(n).
仔细观察‘变态跳台阶’,其思路其实和‘跳台阶很类似’,如下:
f(1) = 1 //n = 1时,只有1种跳法,f(1) = 1
f(2) = 2 //n = 2时,会有两个跳得方式,一次1阶或者2阶
n>=3时:
f(3) = f(1) + f(2) + 1 //最后的1表示3阶一次跳3阶的一种方法
...
f(n) = f(1) + f(2) + ... + f(n-3) + f(n-2) + f(n-1) + 1
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.value=[0]*50 def jumpFloorII(self, number): # write code here if number==0: return -1 self.value[0]=1 self.value[1]=2 for i in range(2,number): m=0 while m<=i-1: #注意这里从f(1)+....+f(n-1)的条件 self.value[i]+=self.value[m] m+=1 self.value[i]+=1 return self.value[number-1]
但是上述方法其实还可以简化:
由上我们已经得到: f(n) = f(1) + f(2) + ... + f(n-3) + f(n-2) + f(n-1) + 1
设 f(0) = 1,则上述可变为: f(n) = f(0) + f(1) + f(2) + ... + f(n-3) + f(n-2) + f(n-1)
同时也有: f(n-1) = f(0) + f(1) + f(2) + ... + f(n-3) + f(n-2) 代入上式有: f(n) = 2*f(n-1)
前提 f(0)=1(但是没有0阶台阶的,这只是用来推导,没有实际意义), f(1)=1, 可以得到:
f(2)=2, f(3)=4, f(4)=8, f(5)=16....
从而得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:
| 1 ,(n=0 )
f(n) = | 1 ,(n=1 )
class Solution: def __init__(self): self.value=[0]*50 def jumpFloor(self, number): # write code here if number==0: return -1 self.value[0]=1 #没有0阶台阶 self.value[1]=1 for i in range(2,number+1): self.value[i]=2*self.value[i-1] return self.value[number]