给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 O ( l o g n ) O(log n) O(logn) 时间复杂度和 O ( 1 ) O(1) O(1) 空间复杂度。
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
输入: nums = [3,3,7,7,10,11,11]
输出: 10
1
<
=
n
u
m
s
.
l
e
n
g
t
h
<
=
1
0
5
1 <= nums.length <= 10^5
1<=nums.length<=105
0
<
=
n
u
m
s
[
i
]
<
=
1
0
5
0 <= nums[i] <= 10^5
0<=nums[i]<=105
public class Single_element {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int [] nums = {1,1,2,3,3,4,4,8,8};
System.out.println(singleNonDuplicate(nums));
}
public static int singleNonDuplicate(int[] nums) {
int l = 0, h = nums.length/2;
while(l < h) {
int m = l + (h - l) / 2;
int loc = m * 2;
if(nums[loc] == nums[loc + 1]) {
l = m + 1;
}else {
h = m;
}
}
return nums[2 * l];
}
}
时间复杂度: O ( l o g n ) O(logn) O(logn),其中 n n n 是数组 n u m s nums nums 的长度。需要在偶数下标范围内二分查找,二分查找的时间复杂度是 O ( l o g n ) O(logn) O(logn)。
空间复杂度: O ( 1 ) O(1) O(1)。
来源:力扣