nums,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。O(log n) 时间复杂度和 O(1) 空间复杂度。mid 位置的奇偶性及其前后的数值相等情况来进行判断区间的缩减。i,则 [0, i-1] 的区间内,偶数索引 j 上的值必定等于 j+1 上的值;同理,[i+1, nums.size()-1] 的区间内,奇数索引 k 上的值必定等于 k+1 上的值。class Solution
{
public:
int singleNonDuplicate(vector<int>& nums)
{
int m = nums.size();
int l = 0, r = m-1;
int mid;
while(l < r)
{
mid = l + (r - l)/2;
if(mid % 2 == 0)
{
if(mid == m-1 or nums[mid] != nums[mid+1])
r = mid;
else l = mid + 1;
}
else
{
if(nums[mid] != nums[mid-1])
r = mid;
else l = mid + 1;
}
}
return nums[l];
}
};
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]) { // 要理解该式子,只需要将 mid 代入偶数或奇数即可
low = mid + 1;
} else {
high = mid;
}
}
return nums[low];
}
};