我以前的qs。不清楚,所以我再次明确表达。 我需要一个有效的算法来计算一系列算术进展的数量。单个AP中的元素数量应该> 2。 例如。如果系列是{1,2,2,3,4,4},那么下面列出了不同的解决方案(带索引号):
0,1,3
0,2,3
0,1,3,4
0,1,3,5
0,2,3,4
0,2,3,5
hence the answer should be 6
当这些数字变大并且数组大小增加时,我无法对其进行编码。我需要一个有效的算法。
答案 0 :(得分:0)
首先,你的回答是不正确的。数字2,3,4(索引也是2,3,4)形成一个AP。
其次,这是一个简单的强力算法:
def find (vec,value,start):
for i from start to length(vec):
if vec[i] == value:
return i
return None
for i from 0 to length(vec) - 2:
for j from i to length(vec) - 1:
next = 2 * vec[j] - vec[i] # the next element in the AP
pos = find(vec,next,j+1)
if pos is None:
continue
print "found AP:\n %d\n %d\n %d" % (i,j,pos)
prev = vec[j]
here = next
until (pos = find(vec,next = 2*here-prev,pos+1)) is None:
print ' '+str(pos)
prev = here
here = next
我认为你不能比这个O(n^4)
做得更好,因为要打印的AP总数是O(n^4)
(考虑一个零向量)。
另一方面,如果您只想打印最大 AP,即未包含在任何其他AP中的AP,则问题会变得更加有趣......