力扣540. 有序数组中的单一元素

这一题的大意是说给出一个单增的有序数组,每一个元素都会出现两次,只有一个元素会出现一次,现在让我们返回只出现一次的那一个数。
题目上要求时间复杂度为O(logn)空间复杂度O(1)
很明显只有二分。
关键在于怎么二分
需要我们深刻理解题目上的条件。
每一个元素都会出现两次,只有一个元素会出现一次 那么一定是奇数个
又因为数组是有序的,是从小到大的,那么单个元素出现两次,这两个相同的元素一定是相邻的。
那么那一个只出现一次的数一定位于偶数位
并且如果元素位于只出现一次的元素的右边,那么一个偶数位2k的元素一定和奇数位2k+1的元素是不相等的。
如果元素位于只出现一次的元素的左边,那么一个偶数位2k的元素一定和奇数位2k+1的元素是相等的。
那么我们就明确了二分的条件。
因为只能找用偶数和它相邻的奇数作比较,因此我们的二分范围为
l=0 r=(nums.size()-1)/2-1;
完整代码如下:
class Solution {
public:int singleNonDuplicate(vector<int>& nums) {int l=0;int r=(nums.size()-1)/2-1;while(l<=r){int mid=(l+r)/2;if(nums[mid*2]==nums[mid*2+1]){l=mid+1;}else{r=mid-1;}}return nums[l*2];}
};
时间复杂度O(logn)
关键在于分析清楚题意,明确二分的条件。
