在连续的重复元素数组中查找单个元素

时间:2015-07-10 20:01:36

标签: c++ algorithm data-structures

给定一个元素数组,其中除了单个元素之外,每个元素都被重复。此外,所有重复的元素都是相互连续的。

我们需要找出该单个元素的索引。

注意:

  1. 数组可能无法排序

  2. 预计时间O(logn)

  3. 元素范围可以     做任何事。
  4. O(n)是微不足道的。但我怎么能找出登录? 对按位运算符也提出了一个想法,但没有任何结果。

    此外,我无法在此问题中使用此声明所有重复的元素都是相互连续的。

    Ex:  2 2 3 3 9 9 1 1 5 6 6
         output 5
    

2 个答案:

答案 0 :(得分:5)

可以通过检查arr[2k] == arr[2k+1], k>=0是否可以在O(logn)中完成 - 如果是,那么不同的元素是AFTER 2k+1,如果它不是 - 那么之前是2k+1

这允许你通过检查中间值来有效地修剪每一步的一半数组,并且仅在一半大的问题上递归,总体上得到O(logn)

Python代码:

def findUnique(arr,l,r):
    if r-l < 2: 
        return (arr[l],l)
    mid = (r-l)/2 + l
    if mid % 2 != 0:
        flag = -1
    else:
        flag = 0
    if (mid == 0 or arr[mid-1] != arr[mid] ) and (mid == len(arr)-1 or arr[mid] != arr[mid+1] ):
        return (arr[mid],mid)
    if arr[mid+flag] == arr[mid+1+flag]:
        return findUnique(arr,mid,r)
    return findUnique(arr,l,mid)

答案 1 :(得分:1)

假设每个元素重复两次,除了一个,那么很容易。 第一个答案是正确的,只是觉得我可以对它进行详细说明。

所以,让我们看看你的示例数组。

a = [2 2 3 3 9 9 1 1 5 6 6];

如果所有元素都已配对,那么您可以使用偶数索引并确保下一个元素是相同的。

a[0] = 2;
a[1] = 2; //as well
a[2] = 3;
a[3] = 3; //as well

一般情况:

a[k] = a[k+1] = x; 

其中k是偶数,x是某个值。

但是,在您的情况下,我们知道有一个索引不遵循此规则。 为了找到它,我们可以使用Binary Search(仅供参考),在中间进行一些额外的计算。 我们去中间的某个地方,抓住一个偶数索引的元素。 如果那个元素&#39;价值等于下一个元素&#39;值,然后你的孤独值在数组的第二部分,因为配对尚未被破坏。 如果这些值不相等,那么你的孤独值在上半部分或者你在它(它在中间)。

您需要检查之前和之后的几个元素以确保。

通过每次迭代将数组减半,您将获得O(logn)时间。