"""
题目:
输入一个没有重复数字的单调递增的数组,数组中至少有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)
《剑指offer》面试题93:最长菲波那切数列(python实现)
最新推荐文章于 2022-04-08 10:14:08 发布