题目
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。
链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array
思路
不考虑时间复杂度,可以使用异或
二分查找
如果折半的长度是奇数,并且中间的数mid等于相邻左边的值,说明需要查找的值在右边
如果折半的长度是奇数,并且中间的数mid等于相邻右边的值,说明需要查找的值在左边
如果折半的长度是偶数,并且中间的数mid等于相邻左边的值,说明需要查找的值在左边
如果折半的长度是偶数,并且中间的数mid等于相邻右边的值,说明需要查找的值在右边
需要注意,长度是奇数mid±1 长度是偶数mid±2
同时可以发现,折半的区间长度包括初始长度都是奇数,最后可能只有一个数,这个就是结果
代码
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int l=0;
int r=nums.size()-1;
int mid=0;
while(l<=r){
mid=l+(r-l)/2;
if(l==r||nums[mid]!=nums[mid-1]&&nums[mid]!=nums[mid+1])
return nums[mid];
else if(((r-l+1)/2)%2){
if(nums[mid]==nums[mid-1])
l=mid+1;
else
r=mid-1;
}else{
if(nums[mid]==nums[mid-1])
r=mid-2;
else
l=mid+2;
}
}
return -1;
}
};