题目:
给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
示例 :
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
思路:
使用Java编写,主要思路还是二分查找,最关键的是怎么确定这个单个的数在mid的左侧还是右侧。具体的实现过程和思路见代码以及其中注释。
代码:
public int singleNonDuplicate(int[] nums) {
//如果是无序的话应该借助异或运算符
int l = 0,r=nums.length-1;
int res=0;
while(l<=r){
//怎么考虑这个我们需要的值是在mid的左还是右
int mid =l+((r-l)>>1);
//可以通过mid位置的奇偶去判断
//这里要注意边界判断要写在前面,不然先判断后面可能会报错
if(mid<nums.length-1&&nums[mid]==nums[mid+1]){
//此时mid和后一个数相等,若mid在单个数后如[0,0,1,2,2,..],
//此时2下标是奇数则唯一数在左边,调整right
if(mid%2!=0) r =mid -1;
//在左边就跳过两个值因为后面那个和他也相等
else l = mid+2;
}
else if(mid>0&&nums[mid]==nums[mid-1]){
//同理
if(mid%2!=0) l=mid+1;
else r = mid-2;
}
else{
res =nums[mid];
//找到就跳出循环了
break;
}
}
return res;