最长等差数列子序列问题如下。给定一个整数数组A,设计一种算法来找到其中最长的等差数列。换句话说,找到一个序列i1 < i2 < ... < ik,使得A [i1],A [i2],...,A [ik]形成一个等差数列,并且k是最大的。以下代码在O(n ^ 2)时间和空间中解决了该问题。(修改自http://www.geeksforgeeks.org/length-of-the-longest-arithmatic-progression-in-a-sorted-array/。)
#!/usr/bin/env python
import sys
def arithmetic(arr):
n = len(arr)
if (n<=2):
return n
llap = 2
L = [[0]*n for i in xrange(n)]
for i in xrange(n):
L[i][n-1] = 2
for j in xrange(n-2,0,-1):
i = j-1
k = j+1
while (i >=0 and k <= n-1):
if (arr[i] + arr[k] < 2*arr[j]):
k = k + 1
elif (arr[i] + arr[k] > 2*arr[j]):
L[i][j] = 2
i -= 1
else:
L[i][j] = L[j][k] + 1
llap = max(llap, L[i][j])
i = i - 1
k = j + 1
while (i >=0):
L[i][j] = 2
i -= 1
return llap
arr = [1,4,5,7,8,10]
print arithmetic(arr)
这将输出4
。
然而,我希望能够找到算术级数,其中最多缺少一个值。因此,如果arr = [1,4,5,8,10,13],我希望它报告长度为5的进程缺少一个值。
这可以高效地完成吗?