在排序数组A [1..n]中找到两个整数,使得在O(n)时间和O(1)空间中a = 3b - 7

时间:2013-01-26 16:51:21

标签: arrays algorithm

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)做什么的方法是什么? 顺便说一句,我有一个(可能是错误的)草图,它说我们可以使用两条扫描线找到它,但我也不明白。

2 个答案:

答案 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)时间(因为它从不看一个元素超过两次)。