给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 105
解题思路:用0去做 与 运算,O(n)时间复杂度,但是这个题要求O(logn),那就只能是二分了。
代码和提交结果如下:
class Solution {
public int singleNonDuplicate(int[] nums) {
int res = 0;
for(int i = 0 ; i < nums.length ; i++){
res^=nums[i];
}
return res;
}
}
class Solution {
public int singleNonDuplicate(int[] nums) {
int left=0;
int right=nums.length-1;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid] == nums[mid-1]){//中点跟左边的相等,则判断除开中点,左边还剩几位数;
if((mid-left)%2 == 0){//若为偶数,则说明左边的存在答案值,改变right的值
right = mid-2;
} else {//若为奇数,则说明右边的存在答案值,改变left的值
left = mid+1;
}
} else if(nums[mid] == nums[mid+1]){//中点跟右边的相等,则判断除开中点,右边还剩几位数;
if((right-mid)%2 == 0){//若为偶数,则说明右边的存在答案值,改变left的值
left = mid+2;
} else {//若为奇数,则说明左边的存在答案值,改变right的值
right = mid-1;
}
} else{//中点跟左右都不相等,直接返回
return nums[mid];
}
}
return nums[right];
}
}
总结:还是力扣会搞事,情人节找光棍,真行熬。