这题核心是在二分移动哪个边界上
我们最终会以l=r作为终止条件,每一次判断mid,我们都会移动其中一端的边界,因为这道题中如果满足nums[mid] == nums[mid ^ 1]的条件,代表答案在(mid, r]中,肯定不包含mid,所以我们可以将l修改为mid+1
class Solution {
public int singleNonDuplicate(int[] nums) {
int n = nums.length;
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];
}
}