题目描述
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: nums = [3,3,7,7,10,11,11]
输出: 10
将数组两个为一组划分成若干组,如果每组中的数字相同,那么说明结果不在该组里,如果该组中相邻元素不相等,那么说明结果在包含该组的这一段数组中,不一定是该组元素中的元素。由题意可知,题目中数组元素为奇数,要两个为一组划分需要在数组末尾添加一个元素。边界确定:如果两个数不相等,那么有边界为mid,反之左边界为mid+1.
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
nums.push_back(nums.back()+1);
int l=0,r=nums.size()/2-1;
while(l<r)
{
int mid=l+r>>1;
if(nums[mid*2]!=nums[mid*2+1]) r=mid;
else l=mid+1;
}
return nums[l*2];
}
};