二分查找------练习2
1. 题目
2. 思路和题解
对题干进行分析,在nums数组中,每个元素都会出现两次,并且只有一个数会出现一次,那么这个数组长度一定是奇数。其次,这个数组是有序的数组,那么如果一个元素出现两次,那么这两个元素必然相邻。
然后题目要求只出现一次的那个数,并且要求我们的时间复杂度为O(log n),这就启发我们可以用二分查找的思路去思考这道题目。
根据这个思路,如果我们所求的mid是奇数,则将其减1,以确保mid和mid+1是一对元素,如果mid和mid+1位置的元素是相等的,那么就说明单独的元素在右侧,这个时候将left更新为mid+2,如果元素不相等,单独的元素要么在左侧,要么就是此时mid位置对应的元素,这个时候将right更新为mid,最后当left和right相等时,那么我们就找到了单独的元素,然后进行输出即可。
整体代码如下:
class Solution {
public int singleNonDuplicate(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (mid % 2 == 1) {
mid--;
}
if (nums[mid] == nums[mid + 1]) {
left = mid + 2;
} else {
right = mid;
}
}
return nums[left];
}
}