题目描述
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 O(log n)
时间复杂度和 O(1)
空间复杂度。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8] 输出: 2
示例 2:
输入: nums = [3,3,7,7,10,11,11] 输出: 10
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 105
解决方案:
1、遍历查找,暴力搜索
2、二分查找:题设给出数组元素个数一定为奇数,但下标为偶数,故判断下标的奇偶性即可判断目标元素在哪个区间,从而更新两个边界
(一)函数源码:
class Solution { public: int singleNonDuplicate(vector<int>& nums) { if(nums.size()==1) return nums[0]; if(nums[0]!=nums[1]) return nums[0]; for(int i=1;i<nums.size()-1;i++){ if(nums[i]!=nums[i-1] && nums[i]!=nums[i+1]) return nums[i]; } return nums[nums.size()-1]; } };
(二)函数源码:
class Solution { public: int singleNonDuplicate(vector<int>& nums) { int start=0,end=nums.size()-1; int mid=(start+end)/2;; if(end<2) return nums[mid]; while(start<end){ mid=(start+end)/2; if(mid==start||mid==end) { if(nums[end+1]==nums[end]) mid=start; else mid=end; break; } if(nums[mid]==nums[mid+1]){ if(mid%2!=0) end=mid; else start=mid+1; } else if(nums[mid]==nums[mid-1]){ if(mid%2==0) end=mid-1; else start=mid; } else break; } return nums[mid]; } };