题目链接:
540. 有序数组中的单一元素 - 力扣(LeetCode)leetcode-cn.com题目描述:
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
解题思路:
之前其实说过只出现一次的数字,当时面对的是未排序的数组,用的是位运算的方法求解的。而本题则面对的是排序后的数组,且题目要求我们用
的时间复杂度,这很明显就是在让我们用二分法了。
其实无非就两种情况:
- 中间数的下标 m 是奇数,即前后元素的个数为奇数。
此时,如果有 nums[m]==nums[m+1],则唯一数处于 m-1 之前的元素,反之处于 m+1 之后的元素。
- 中间数的下标 m 是偶数,即前后元素的个数为偶数。
此时,如果有 nums[m]==nums[m+1],则唯一数处于 m+2 之后的元素,反之处于 m 之前的元素。
总之,就是要保证剩余查找区间内元素的个数是奇数。
代码如下:
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int l = 0, r = nums.size()-1;
while (l < r) {
int m = (r + l) / 2;
if (m % 2 == 1){
if (nums[m] == nums[m+1]) r = m - 1;
else l = m + 1;
}
else {
if (nums[m] == nums[m+1]) l = m + 2;
else r = m;
}
}
return nums[l];
}
};
如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。