给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
示例 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) 空间复杂度中运行吗?
注意:本题与主站 540 题相同:https://leetcode-cn.com/problems/single-element-in-a-sorted-array/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/skFtm2
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题也是比较经典的问题,如果不是排序数组,那么直接所有值做异或即可,但是排序数组,我们尝试使用二分法将进行求解,这里举两个例子
以上两个例子,此时中间的 mid 都是 3,如果此时 mid 和 后一个值相等,(例子 1)判断此时 mid 的下标,如果是奇数,说明出现一次的数字在它前面,让 right = mid - 1 ,如果是偶数,说明在右侧,此时让 left = mid + 2,在右侧
如果 mid 和前一个值相等,判断 mid 下标是奇数还是偶数,如果是奇数,说明出现一次的数字在右侧,某则在左侧
class Solution {
public int singleNonDuplicate(int[] a) {
int left = 0, right = a.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (mid > 0 && a[mid] == a[mid - 1]) {
if (mid % 2 == 0) {
right = mid - 2;
} else {
left = mid + 1;
}
} else if (mid < a.length - 1 && a[mid] == a[mid + 1]) {
if (mid % 2 == 0) {
left = mid + 2;
} else {
right = mid - 1;
}
} else {
return a[mid];
}
}
return -1;
}
}