《剑指offer》面试题93:最长菲波那切数列(python实现)

"""
题目:
输入一个没有重复数字的单调递增的数组,数组中至少有3个数字,请问数组中最长的菲波那切数列的长度是多少?
例如:
输入[1,2,3,4,5,6,7,8],由于其中最长的菲波那切数列是1,2,3,5,8,因此输出5

分析:
设f(x,y)代表以nums[x],nums[y]为最大数和次大数的组合,然后往前看,是否存在一个元素等于nums[x]-nums[y],
如果有一个元素(索引为z)满足这个条件,则f(x,y) = f(y,z)+=1。
在递归过程中,对于f(x,y),
1、如果y等于0,则意味着已经找到头了,此时要返回2.如在例子中,f(7,6) = f(6,0),f(6,0)要返回2
2、如果nums[x]-nums[y]的差值比num[y]要大,也要返回2.如在例子中,f(7,5) = f(5,1),nums[5]-nums[1]=4,虽然元素4也在nums中,
但是[4,2,6,8]并不是一个菲波那切数列,因此当nums[x]-nums[y]的差值比num[y]要大时,也认为找到头了,返回2.
3、如果nums[x]-nums[y]的差值不在nums中,则也认为找到头了,返回2.

在调用递归的时候,(x,y)的组合是nums中任意两两元素的组合,即f(7,6)要找一次,f(7,5)也要找,f(7,4)也要找,直到f(7,0),
然后找f(6,5),f(6,4)...以此类推,直到f(1,0)
"""

def feibo(nums,result_map,x,y):
    if y == 0:
        return 2
    else:
        if (x,y) in result_map:
            return result_map[(x,y)]
        else:
            D_value = nums[x] - nums[y]
            if D_value > nums[y]:
                return 2
            if D_value in nums:
                D_value_index = nums.index(D_value)
                length_feibo = feibo(nums,result_map,y,D_value_index)+1
                result_map[(x,y)] = length_feibo
                return length_feibo
            else:
                return 2
def find_feibo(nums):
    index_max = len(nums)-1
    index_max_brother = index_max -1
    result_map = {}
    length_all = set()
    for i in range(index_max,0,-1):
        for j in range(index_max_brother,-1,-1):
            length = feibo(nums,result_map,i,j)
            length_all.add(length)
    print(max(length_all))

nums = [1,2,3,4,5,6,7,8]
find_feibo(nums)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值