检查排序数组A中是否存在A [i] = 2A [j]

时间:2016-12-13 05:40:22

标签: arrays algorithm

我有一个类似于这个问题的问题:check if there exists a[i] = 2*a[j] in an unsorted array a?并做了一些修改。

  

输入是排序为n个正数的数组A [1 ... n]   增加秩序。

     

问题是确定是否存在一对索引i和j   这样A [i] = 2A [j]。

     

为此问题设计和分析O(n)时间就地算法

如果我可以将每个元素的两倍存储在辅助数据结构中并通过将值与原始数组值进行比较来循环,那么问题就很简单了,但就地规范禁止这样做。我能想出的最好的是O(nlogn),对于n个元素中的每个元素,我都会对该元素的双重进行二分搜索,但是我无法以更快的方式绕过我的脑袋。 / p>

2 个答案:

答案 0 :(得分:3)

随着A的增加,所以:

  1. i > j
  2. 如果A[i] > 2 * A[j](i, k)k <= j无效,则
  3. 如果A[i] < 2 * A[j](k, j)k <= i无效,则
  4. 所以算法如下面的python代码:

    def foo(a):
        i = 1
        j = 0
        n = len(a)
    
        while n > i > j:
            if a[i] == 2 * a[j]:
                print("a[{}] = 2 * a[{}]".format(i, j))
                i += 1
            elif a[i] < 2 * a[j]:
                i += 1
            else:
                j += 1
                if i == j:
                    i += 1
    

答案 1 :(得分:0)

伪代码:

i = 1
j = 1
while j <= n and 2 * A[i] <> A[j]
    if 2 * A[i] < A[j]
        i = i + 1
    else /* 2A[i] is greater than A[j] */
        j = j + 1
if j <= n
    print i, j

此算法使用以下功能

  1. 如果2A [i]&lt; A [j]下部元素的解可以位于区间[i + 1,...,j - 1]
  2. 如果2A [i]> [j]上部元素的解决方案必须位于[j + 1,...,n]
  3. 循环最多需要2个 n 步骤,因此这些算法需要 O n )步骤。