- 题目:一个有序的数组中,只有一个元素只出现一次,其余元素都出现两次,找出出现一次的这个元素(时间复杂度要求为o(logn) 空间复杂度要求为o(1))
- 难度:Medium
- 思路:由于数组是排好序的,自然而然想到二分查找,通过判断nums[mid]的值来调整left和right指针
- 代码:
public class Solution {
public int singleNonDuplicate(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
int len = nums.length;
int left =0;
int right = len-1;
while(left <= right){
int mid = left + (right-left)/2;
if(mid != 0 && mid != len-1){
if(nums[mid] != nums[mid-1] && nums[mid] != nums[mid+1]){
return nums[mid];
}else if(nums[mid] == nums[mid+1]){
if(mid%2 == 1){
right = mid-1;
}else{
left = mid+2;
}
}else{
if((mid-1)%2 == 1){
right = mid-2;
}else{
left = mid+1;
}
System.out.println(left + " - " + right);
}
}else if(mid == 0){
if(nums[mid] == nums[mid+1]){
left = 2;
}else{
return nums[mid];
}
}else{
if(nums[mid] == nums[mid-1]){
right = len-3;
}else{
return nums[mid];
}
}
}
return nums[left+1];
}
}