有序数组中的单一元素
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
二分查找
比较简单 算法就是二分
关键点在于对于mid是不是要找的元素的判断条件怎么写
如果mid不是要找的元素 怎么去分辨选择哪一侧的元素继续查找
怎么操作l和r两个指针移动来保证可以恰好排除不符合要求的元素又不会漏掉可能成为答案的元素
我的代码
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int n=nums.size();
int l=0,r=n-1;
if(n==1)
{
return nums[0];
}
while(l<r)
{
int mid=l+(r-l)/2;
if(nums[mid-1]==nums[mid])
{
if((mid+1)%2==0)
{
l=mid+1;
}
else
{
r=mid-2;
}
}
else if(nums[mid+1]==nums[mid])
{
if((mid+1)%2==0)
{
r=mid-1;
}
else{
l=mid+2;
}
}
else{
return nums[mid];
}
}
return nums[l];
}
};
二分查找,时间复杂度O(logn)