题干:
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例:
输入: nums = [1,1,2,3,3,4,4,8,8] 输出: 2输入: nums = [3,3,7,7,10,11,11] 输出: 10
public class 有序数组中的单一元素 {
public static void main(String[] args) {
int[] nums = {1,1,2,3,3,4,4,8,8};
System.out.println(singleNonDuplicate(nums));
}
public static int singleNonDuplicate(int[] nums) {
int i=0,j=nums.length-1;
while(i<j){
int mid = i+(j-i) / 2;
//两边是奇数个
if(mid%2==1){
if(nums[mid]==nums[mid-1]) i=mid+1;
else if(nums[mid]==nums[mid+1]) j=mid-1;
else return nums[mid];
}
//两边是偶数个
else {
if(nums[mid]==nums[mid-1]) j=mid-2;
else if(nums[mid]==nums[mid+1]) i=mid+2;
else return nums[mid];
}
}
return nums[i];
}
}
首先,我们需要发现的是整个数组里面,只有一个单身狗,其他都是情侣,那么也就是说整个数组的长度肯定是奇数个,然后我们可以用二分查找去搜索nums[mid],判断其与左右两边哪边相同,再分情况继续二分查找。
这里要分的情况是两种情况:
- 左边奇数个,中间一个,右边奇数个。那么如果nums[mid]和左右某一边的数相同的话,剩下的那个单生狗一定藏在另一边。
- 左边偶数个,中间一个,右边偶数个。那么如果nums[mid]和左右某一边的数相同的话,剩下的那个单生狗一定藏在这一边。