题目:
Given a sorted array consisting of only integers where every element appears twice except for one element which appears 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.
思路一:
找出一个有序数组中,值只出现一次的那个数,其它值都出现过两次,时间复杂度O(n),空间复杂度O(1)。
从0索引开始遍历,到倒数第三个数,步长为2,如果当前这个数与之后那个数不相等,返回当前数,否则索引加2;如果循环完没有返回,那么单一值一定是最后一个
代码:
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int len=nums.size();//计算nums的长度
for(int i=0;i<len-2;i+=2){//从0索引开始遍历,到倒数第三个数,步长为2
if(nums[i]!=nums[i+1]){//如果当前这个数与之后那个数不相等
return nums[i];//返回当前数,否则索引加2
}
}
return nums[len-1];//如果循环完没有返回,那么单一值一定是最后一个
}
};
**输出结果:**6ms
方法二:
直接上代码,利用二分法的思想~这回满足O(log n)的复杂度了
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int len=nums.size();
if(len==0){//如果长度为0,直接返回0
return 0;
}
if(len<3){//长度小于3,返回第一个元素
return nums[0];
}
int beg=0;//利用双指针
int end=len-1;
int mid=(end-beg)/2+beg;//利用二分法的思想
while(mid!=beg&&mid!=end&&(nums[mid]==nums[mid-1]||nums[mid]==nums[mid+1])){//循环条件
if(((end-beg+1)/2)%2){//如果数组元素个数除以二后得到的是奇数
if(nums[mid]==nums[mid-1]){
beg=mid+1;
mid=(end-beg)/2+beg;
}
else{
end=mid-1;
mid=(end-beg)/2+beg;
}
}
else{//如果数组元素个数除以二后得到的是偶数
if(nums[mid]==nums[mid-1]){
end=mid-2;
mid=(end-beg)/2+beg;
}
else{
beg=mid+2;
mid=(end-beg)/2+beg;
}
}
}
return nums[mid];
}
};