二分法
(1)先找到中间值mid,然后对左右元素进行判断,如果都不等于,就证明该元素为单独的
(2)如果左相等或者右相等,就根据情况进行在次二分
重点在于如何判断mid值二分 左边还是右边
通过判断mid和相等这mid+1或者m-1,前后的数组元素的奇偶
奇数证明该数组含有单个元素,就进行二分继续查找
public static int singleNonDuplicate(int[] nums) {
int left = 0;
int right = nums.length-1;
while(left < right) {
int mid = left + (right - left) / 2;//找中间值
if(nums[mid] == nums[mid+1]) {//中间值和右边一样
//判断mid和mid+1 两边的数的奇偶,如果是偶数,说明该侧都是成对出现的
if((mid - left) % 2 == 0) {//如果mid右侧的元素数组为偶数
left = mid + 2;//让左指针指向mid+1后面
}else {//如果mid右侧的元素数组不为偶数,即mid左侧的元素数组为积数
right = mid -1;
}
}else if (nums[mid] == nums[mid-1]) {
if((mid-1 - left) % 2 == 0) {
left = mid + 1;
}else {
right = mid-2;
}
}else {
return nums[mid];
}
}
return nums[left];
}
真的不会写算法