给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8] 输出: 2示例 2:
输入: [3,3,7,7,10,11,11] 输出: 10
解题思路:如果数组中每个元素都出现两次,那么数组总元素个数是偶数,且偶数个元素一定与其前一个元素相等,与其后一个元素不等。因此,每次二分折半的时候控制前半个元素个数为奇数个,若mid元素与后一个元素相等,说明单个元素在后半段,设start=mid+2;若不相等,说明单个元素在前半段,将end=mid;直到遍历完成,返回找到的元素。
class Solution {
public int singleNonDuplicate(int[] nums) {
int length = nums.length;
int start = 0,end = length-1;
while(start<end){
int mid = (start+end)/2;
if(mid%2 == 1){
mid--;
}
if(nums[mid] != nums[mid+1]){
end = mid;
}else{
start = mid+2;
}
}
return nums[end];
}
}