A [1..n]只有正元素。
我有一个O(n)的解决方案:
B = new Array()
for i=1 to n
B[i] = 3A[i]-7
C = merge(A,B) such that C is also sorted
for i=1 to n-1
if (C[i] == C[i+1])
return TRUE
return FALSE
O(1)做什么的方法是什么? 顺便说一句,我有一个(可能是错误的)草图,它说我们可以使用两条扫描线找到它,但我也不明白。
答案 0 :(得分:2)
将两个索引i1和i2初始化为排序数组的开头。
现在循环:
获取i1的值,并计算3b-7。
现在从i2向前搜索,直到值>> =搜索值。如果是=,则找到两个整数。如果是>然后推进i1并循环。
答案 1 :(得分:2)
从左到右扫描数组,保留两个指针:一个指向b
的当前候选者,另一个指向a
的当前候选者。这是一个伪代码实现(也恰好是可运行的Python):
def find(l):
i, j = 0, 0
while i < len(l) and j < len(l):
b = l[i]
a = 3 * b - 7
while j < len(l) and l[j] < a:
j += 1
if j < len(l) and l[j] == a:
return i, j
i += 1
return None
l = [1, 3, 5, 8, 10, 27, 45]
print find(l)
这是O(1)空间和O(n)时间(因为它从不看一个元素超过两次)。