class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
left, right = 0, len(nums)-1
while left < right:
mid = left+(right-left)//2
if mid % 2 == 0: #偶数
if nums[mid] == nums[mid+1]: #在右边
left = mid
else: #在左边
right = mid
else: #奇数
if nums[mid] == nums[mid-1]: #在右边
left = mid + 1
else: #在左边
right = mid - 1
return nums[left]
首先我们确定按照题目的排列方式,我们有 个元素,我们知道mid对应的是中间那个数的下标,对应正好是这个数前面有多少个数。
比如 ,中间的数是 ,在nums[4]前面有四个数 ,现在这种情况我们知道单个的数2是插在中间数的前面的,所以在这种中间数前面的数的个数是偶数的情况, ,因此让上界减少,再找。
换一种 ,中间的数是 ,在这种单个数4插在中间数的后面的, ,让下界增大,再找。
同理如果 是奇数,单个插入的数在中间数前面,比如 ,中间数 ,则 ,如果单个插入的数在中间数后面,比如 ,中间数 ,则