/*
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
[0,1,1,2,2,5,5]
示例 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)空间复杂度中运行。*/
/*
思路: 用二分法.
mid 为偶数: mid和哪边元素相同,单个的数就在哪边.
mid 为奇数: mid和哪边元素不同,单个的数就在哪边.
为了简化代码,当mid为奇数时,mid--,转化为偶数.
*/
1 class Solution540 {
2
3 public int singleNonDuplicate(int[] nums) {
4 int left = 0;
5 int right = nums.length - 1;
6 while (left < right) {
7
8 int mid = (left + right) >> 1;
9 if ((mid & 1) == 1) {
10 --mid;
11 }
12 if (nums[mid] == nums[mid + 1]) {
13 left = mid + 2;
14 } else {
15 right = mid;
16 }
17 }
18 return nums[left];
19 }
20 }