给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数
输入: [3,3,7,7,10,11,11]
输出: 10
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
class Solution {
public int singleNonDuplicate(int[] nums) {
int left=0;
int right = nums.length-1;
int m =left+(right-left)/2;
while(left<right){
//如果该m位置与前后都不相同,就是要找的数字;
//否则如果目标数字在m前面,那么与【m】相同的第二个数字的下标+1一定为偶数第一个为奇数,在m后面的话则相反;
m=left+(right-left)/2;
if(nums[m] != nums[m-1] && nums[m] != nums[m+1]) return nums[m];
if(nums[m-1] == nums[m]){
if( m % 2 == 0){
right = m-2;
}else{
left=m+1;
}
}else{
if( m % 2 == 0){
left = m+2;
}else{
right=m-1;
}
}
}
return nums[left];
}
}
主要思路是使用二分法,然后根据中间指针的index来判断目标数字在前面还是后面,如果在后面那么前面的数字的长度肯定为偶数,在后面则前面的数字的长度为奇数。
这个时间复杂度 > 1 && < logn