x0v*_*x0v 1 c++ algorithm data-structures
给定一个元素数组,其中除了单个元素之外,每个元素都被重复.此外,所有重复的元素彼此连续.
我们需要找出该单个元素的索引.
注意:
数组可能无法排序
预期时间O(logn)
O(n)是微不足道的.但我怎么能找出登录?给按位运算符一个想法,但没有任何结果.
另外,我无法在这个问题中使用这个陈述,所有重复的元素都是相互连续的.
Ex: 2 2 3 3 9 9 1 1 5 6 6
output 5
Run Code Online (Sandbox Code Playgroud)
它可以在O(logn)中完成,检查是否arr[2k] == arr[2k+1], k>=0- 如果是,那么不同的元素是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)
Run Code Online (Sandbox Code Playgroud)