Skip to main content

singleElementInSortedArray

class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
# sorted array
n = len(nums)
if n < 2:
return(nums[0])

left = 0
right = n

# nums to left have first entry in even
# [1, 1, 2, 2, ...]
# nums to right have first entry in odd
# [1, 1, bad, 2, 2, 3, 3]

while left < right:
mid = left + (right - left) // 2

# check mid
if 0 < mid < n - 1:
if nums[mid] != nums[mid - 1] and nums[mid] != nums[mid + 1]:
return(nums[mid])

elif mid == 0 and nums[mid] != nums[mid + 1]:
return(nums[mid])
elif mid == n - 1 and nums[mid] != nums[mid - 1]:
return(nums[mid])


# decide which way to go
# if mid is even, and it's the same as it's right counterpart, answer to right
if mid % 2 == 0:
if mid < n - 1:
if nums[mid] == nums[mid + 1]:
left = mid + 1
else:
right = mid
else:
print("bad 0")

elif mid % 2 != 0:
if mid > 0:
if nums[mid] == nums[mid - 1]:
left = mid + 1
else:
right = mid
else:
print("bad 1")

return(-1)