[剑指offer] 8+9. 跳台阶+变态跳台阶 (递归 时间复杂度)

跳台阶是斐波那契数列的一个典型应用,其思路如下:

# -*- 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 )

              | 2*f(n-1),(n>=2)
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]

 

 

转载于:https://www.cnblogs.com/nicetoseeyou/p/10452097.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值