我有这个算法,我想知道是否可以使它更好(复杂性更低):
for i = 3 to A.length
for j = 2 to i − 1
for k = 1 to j − 1
if |A[i] − A[j]| = = |A[j] − A[k]| or |A[i] − A[k]| = = |A[j] − A[k]|
return true
return false
复杂度必须是O(n ^ 3),“或”之后的句子才是 A [i] = A [j]的
我不确定是否可以存在更好的算法...
答案 0 :(得分:1)
您可以通过散列差异计数来缩短到O(n^2)
时间(但会增加空间复杂度)。
答案 1 :(得分:1)
您可以预先对数组进行排序,并使用二进制搜索将时间复杂度从 O(N ^ 3)降低到 O(N ^ 2 logN)。
伪代码 -
sort(A)
for i = 1 to A.length - 2
for j = i + 1 to A.length - 1
//search for an element A[k] such that A[k]-A[j] == A[j]-A[i]
if binary_search(A, 2 * A[j] - A[i], j + 1, A.length)
return True
return False
binary_search(A, x, i, j)
如果true
出现在x
指数A
和i
之间,则会返回j
。
与涉及散列的其他解决方案不同,您不需要任何额外的空间。