给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: nums = [3,3,7,7,10,11,11]
输出: 10
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 105
进阶: 采用的方案可以在 O(log n) 时间复杂度和 O(1) 空间复杂度中运行吗?
1.暴力 O(n) O(1)
public int singleNonDuplicate(int[] nums) {
for(int i=0;i<nums.length-1;i+=2){
if(nums[i] != nums[i+1]){
return nums[i];
}
}
return nums[nums.length-1];
}
2.二分 O(logn) O(1)
public int singleNonDuplicate(int[] nums) {
int low = 0;
int high = nums.length-1;
while(low < high){
int mid = low+(high-low)/2;
if(nums[mid] == nums[mid-1]){
//前半部分
if((mid - low)%2 ==0 ){
//左边若为偶数,答案值一定存在于左边
high = mid-2;
}else{
low = mid+1;
}
}else if(nums[mid] == nums[mid+1])
{
//后半部分
if((high-mid)%2 ==0){
low = mid+2;
}else{
high = mid-1;
}
}else{
//都不相等,直接返回
return nums[mid];
}
}
return nums[low];
}