是的,数组已排序,因此我们可以应用二进制搜索来查找单个元素。让我们看看单个元素的出现模式。元素总数总是奇数,单个元素仅出现在偶数索引处
元素总数 9,单个元素总是出现在偶数索引处。当 时(end_index - start_index) % 4 == 0
,单个元素出现在中间。
if A[mid-1] == A[mid] --> single element left side
if A[mid] == A[mid+1] --> single element right side
![元素总数 11](https://i.stack.imgur.com/uZT7Y.png)
元素总数 11,单个元素总是出现在偶数索引处。当 时(end_index - start_index) % 4 != 0
,单个元素不在中间出现。
if A[mid] == A[mid+1] --> single element left
if A[mid-1] == A[mid] --> single element right
![在此处输入图像描述](https://i.stack.imgur.com/dAwY3.png)
元素总数 13,单个元素总是出现在偶数索引处。当 时(end_index - start_index) % 4 == 0
,单元素也出现在中间。
if A[mid-1] == A[mid] --> single element left side
if A[mid] == A[mid+1] --> single element right side
下面是 Python 代码:
class Solution:
def singleNonDuplicate(self, A):
"""
:type nums: List[int]
:rtype: int
"""
L = len(A)
def binarySearch(A, start, end):
if start == end:
return A[start]
if start < end:
mid = int(start + (end - start)/2)
if A[mid-1] < A[mid] < A[mid+1]:
return A[mid]
if end - start == 2:
if A[end] != A[end-1]:
return A[end]
if end - start == 2:
if A[start] != A[start+1]:
return A[start]
if A[mid] == A[mid+1]:
if int(end-start)%4 == 0:
return binarySearch(A, mid+2, end)
else:
return binarySearch(A, start, mid-1)
elif A[mid-1] == A[mid]:
if int(end - start)%4 == 0:
return binarySearch(A, start, mid-2)
else:
return binarySearch(A, mid+1, end)
return binarySearch(A, 0, L-1)
if __name__ == "__main__":
s = Solution()
A = [1,1,2,3,3,4,4,5,5,6,6]
r = s.singleNonDuplicate(A)
print(r)