You are given a sorted array consisting of only integers where every element appears exactly twice, except for one element which appears exactly once. Find this single element that appears only once.
Example 1:
Input: [1,1,2,3,3,4,4,8,8]
Output: 2
Example 2:
Input: [3,3,7,7,10,11,11]
Output: 10
Note: Your solution should run in O(log n) time and O(1) space.
题目链接:https://leetcode.com/problems/single-element-in-a-sorted-array/
题目分析:很显然要用二分,题目给的限定很死,二分中点,
- 中点和左右均不相等,则直接返回
- 中点和左边相等,此时看左边这段(包含二分的中点)是不是奇数
- 是:答案在此段中
- 否:答案在另一段,注意此时l = mid + 1,因为要保证二分的段长度一定是奇数
- 中点和右边相等,类似情况2
答案在两个端点出现的情况可以提前特判,这样二分的时候就不需要考虑数组越界问题了
0ms,时间击败100%
class Solution {
public int singleNonDuplicate(int[] nums) {
int n = nums.length;
if (n == 1) {
return 1;
}
if (nums[0] != nums[1]) {
return nums[0];
}
if (nums[n - 1] != nums[n - 2]) {
return nums[n - 1];
}
int l = 0, r = nums.length - 1, mid = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (nums[mid] != nums[mid - 1] && nums[mid] != nums[mid + 1]) {
return nums[mid];
}
if (nums[mid] == nums[mid - 1]) {
if ((mid - l + 1) % 2 != 0) {
r = mid;
} else {
l = mid + 1;
}
} else {
if ((r - mid + 1) % 2 != 0) {
l = mid;
} else {
r = mid - 1;
}
}
}
return nums[0];
}
}