给定一个元素数组,其中除了单个元素之外,每个元素都被重复。此外,所有重复的元素都是相互连续的。
我们需要找出该单个元素的索引。
注意:
数组可能无法排序
预计时间O(logn)
O(n)是微不足道的。但我怎么能找出登录? 对按位运算符也提出了一个想法,但没有任何结果。
此外,我无法在此问题中使用此声明所有重复的元素都是相互连续的。
Ex: 2 2 3 3 9 9 1 1 5 6 6
output 5
答案 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)时间。