LeetCode540 有序数组中的单一元素

链接: https://leetcode-cn.com/problems/single-element-in-a-sorted-array/description/

题意

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
要求解法在 O(log n)时间复杂度和 O(1)空间复杂度中运行。

解法

找出整个数组中的单一元素,如果元素排列是乱序的,可以用异或的做法
但是那样的时间复杂度是O(n)
由于序列是有序的,所以可以用二分的做法来做
根据当前位置的奇偶可以进行判断要找的数是在之前还是之后

瞎写了两个边界条件居然过了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
if (nums.size() == 1) return nums.back();
short l = 0, r = nums.size(), mid;
while (l < r - 1) {
mid = l + (r - l) / 2;
if (!(mid % 2) && nums[mid] == nums[mid - 1]) {
r = mid;
}
else if (mid % 2 && nums[mid] == nums[mid + 1]) {
r = mid;
}
else {
l = mid;
}
}
return nums[l];
}
};