题目
思路一 二分
对偶数下标二分查找,判断nums[2 * mid] == nums[2 * mid + 1],如果满足则说明要找的数存在于mid右边,否则在mid左边。
代码一
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n >> 1;
while(l < r){
int mid = (l + r) >> 1;
if(nums[2 * mid] == nums[2 * mid + 1]) l = mid + 1;
else r = mid;
}
return nums[2 * l];
}
};
思路二 二分+异或
对全部下标二分查找,判断nums[mid] == nums[mid ^ 1],如果满足则说明要找的数存在于mid右边,否则在mid左边。
代码二
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(nums[mid] == nums[mid ^ 1]) l = mid + 1;
else r = mid;
}
return nums[l];
}
};