题目
难度中等
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
分析
- 数组长度肯定是奇数
- 使用二分法
- 数组 减少一个元素(mid) ,剩下的和是偶数,分两半,要么全是偶数,要么全是奇数
- 二分法中,可能是就这么几个组合,如果mid是偶数(必须让它是),如果是第一种,因为半边是偶数,所以这边剩下的肯定是奇数,那个数肯定在这里边,否则,就是mid,或者mid之前的数
代码如下1 2 2 2 2 3 1 2 3
class Solution { public int singleNonDuplicate(int[] nums) { int head = 0; int tail = nums.length - 1; while (head < tail) { int mid = head + (tail - head) / 2; if (mid % 2 == 1) mid--; if (nums[mid] == nums[mid + 1]) { head = mid + 2; } else { tail = mid; } } return nums[head]; } }