题目链接:540. 有序数组中的单一元素
二分查找,迭代实现。输入序列的长度总为奇数,那么这个序列总具有一个中值:
- 当中值的左值和右值都和其不同时,目标值为中值;
- 当中值的左值或右值和其相同时,这两个相同的值会把序列分为两部分,左段和右段,其中一段的长度为奇数,另一段的长度为偶数,那么目标值一定落在奇数段里。
from typing import List
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
l, r = 0, len(nums) - 1
while l + 1 < r:
m = (l + r) // 2
if nums[m - 1] != nums[m] != nums[m + 1]:
return nums[m]
elif nums[m - 1] == nums[m]:
if (m - 1 - l) & 1 == 0:
l = m + 1
else:
r = m - 2
else:
if (m - l) & 1 == 0:
l = m + 2
else:
r = m - 1
return nums[l]