![0b19725ae3e9395ca8969b5ecf9e5840.png](https://i-blog.csdnimg.cn/blog_migrate/3252a3a3c61d9d2adefebb11543b4648.png)
题目链接: https://leetcode-cn.com/problems/single-element-in-a-sorted-array
难度:中等
通过率:61.6%
题目描述:
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例:
示例 1:
输入: [1,1,2,3,3,4,4,8,8] 输出: 2
示例 2:
输入: [3,3,7,7,10,11,11] 输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
思路:
题目说要在
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
return functools.reduce(operator.xor, nums)
在
即在mid
位置左右两边数都没有重复数,那么它本身单一元素
要么,看以mid
是重复数, 便可分割的数组,左右那边有奇数个数一定存在单一元素,所以我们可以把数据缩小,以此类推。
代码:
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
# 判断mid 左边是否有重复数字
if mid - 1 >= 0 and nums[mid - 1] == nums[mid]:
tmp_right = mid - 2
tmp_left = mid + 1
if (tmp_right - left + 1) % 2 == 0:
left = tmp_left
else:
right = tmp_right
# 判读mid右边是否有重复数字
elif mid + 1 < len(nums) and nums[mid + 1] == nums[mid]:
tmp_left = mid + 2
tmp_right = mid - 1
if (tmp_right - left + 1) % 2 == 0:
left = tmp_left
else:
right = tmp_right
else:
return nums[mid]