题目
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
题解一
class Solution {
public int singleNonDuplicate(int[] nums) {
int left=0;
int right=nums.length-1;
while(left<right){
int mid=left+(right-left)/2;//带入计算后发现不需要+1
if(nums[mid]==nums[mid-1]){//中间和左边相等
if((mid-left)%2==0){//左半部分为偶数说明左边有答案,因为左半边还要减掉一个nums[mid-1]
right=mid-2;
}else{
left=mid+1;
}
}
else if(nums[mid]==nums[mid+1]){//中间和右边相等
if((mid-left)%2==0){//左半部分为偶数说明右边有答案,因为右半边还要减掉一个nums[mid+1]
left=mid+2;
}else{
right=mid-1;
}
}
else{return nums[mid];}
}
return nums[left];
}
}
-
如果过程都没有太大问题可以在idea中进行单步调试,可以很快发现问题。
我在写代码时在第二个if前没有加上else,导致判断只循环一遍,在return mid时直接返回,结束循环。