Leetcode笔记目录
一、题目描述
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例1:
- 输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例2:
- 输入: [3,3,7,7,10,11,11]
输出: 10
二、解题过程
1.思想
要求时间复杂度logn,使用二分法,关键在于如何用mid得到目标在左右哪个区间内,有两种方法:
- 只看偶数索引(简单,只有两种情况);
- 看right-mid的奇偶性,分五种情况讨论。
2.代码
只看偶数索引:
int singleNonDuplicate(vector<int>& nums) {
int left=0,right=nums.size()-1,mid;
while(left<right){
mid = left + (right-left)/2;
if(mid%2!=0)mid--;
if(nums[mid]==nums[mid+1]) left=mid+2;
else right=mid;
}
return nums[left];
}
三、总结
需要仔细考虑而不是套模板的二分法题目。