154.Single Element in a Sorted Array
1.本题我自己的写法受限于奇数和偶数坐标了,一开始尝试了mid的求法还是mid=l+(r-l)/2之后,mid有时为奇数有时为偶数,奇数得和前面对应,偶数得和后面对应,所以分出了挺多类,后来只能按mid为始终为奇数处理,然后采用了下面的mid = l+2*((r-l)/4)的解法。
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
if(nums.size()==1)
return nums[0];
int l = 0,r = nums.size()-1,mid;
while(r-l>=2)
{
mid = l+2*((r-l)/4);
if(nums[mid]==nums[mid+1])
l = mid+2;
else
r = mid;
}
return nums[r];
}
};
- 本题中答案的解法比较简单的一点是,采用c++异或运算,,然后mid为奇数mid1就是mid-1,mid为偶数,mid^1就是mid+1,省去了很多事,也算学到了。最后low和high返回值是一样的。
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int low = 0, high = nums.size() - 1;
while (low < high) {
int mid = (high - low) / 2 + low;
if (nums[mid] == nums[mid ^ 1]) {
low = mid + 1;
} else {
high = mid;
}
}
return nums[low];
}
};