题目
解题
从题意中可知这个数组的长度是奇数,因为每个元素都会出现两次,唯有一个数只会出现一次,而且还是整数的有序数组。
当使用二分算法后,数组从中间值处划分成两个区域,
- 第一个区域是数组第一位(L) 数组中间值(mid)
- 第二区域是数组中间值(mid+1)到数组最后一位
这两个区域会被划分成一个偶数区去和一个奇数区
再看mid 你会发现mid会有三种情况
- mid = mid-1
- mid = mid+1
- mid 不等于mid-1也不等于mid+1
将这种情况整合后你就会发现解题思路
/**
* @param {number[]} nums
* @return {number}
*/
var singleNonDuplicate = function(nums) {
let l = 0;
let r = nums.length - 1;
while(l < r) {
const mid = (l + r) >> 1;
const curValue = nums[mid];
const lValue = nums[mid - 1];
const rValue = nums[mid + 1];
if(mid % 2 == 0) {
if(curValue == lValue) r = mid - 2;
else if (curValue == rValue) l = mid + 2;
else return nums[mid]
}else {
if(curValue == lValue) l = mid + 1;
else r = mid - 1;
}
}
return nums[r]
};