思路
- 使用二分法找到只出现一次的数字
- 根据题目可以知道,数组中始终存在奇数个数字。也就是说,按照二分法,只出现一次的数字肯定出现在right-left为偶数的一边(也可用right+left为偶数进行判断)。因为 [left, right] 区间的数字个数为right-left+1个,如果right-left 为偶数,则+1后区间共有奇数个数,则这个数字必定在这个奇数个数的区间内。
- 终止条件
- left == right
- 当前数字和左右相邻数字都不相等
JAVA实现
class Solution {
public int singleNonDuplicate(int[] nums) {
int left=0,right=nums.length-1;
while(true){
int med=(left+right)/2;
if(left==right||nums[med]!=nums[med-1]&&nums[med]!=nums[med+1]){
return nums[med];
}
else if(nums[med]==nums[med+1]){
if((med+2+right)%2==0){
left=med+2;
}else{
right=med-1;
}
}
else if(nums[med-1]==nums[med]){
if((med-2+left)%2==0){
right=med-2;
}else{
left=med+1;
}
}
}
}
}