给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足时间复杂度和 空间复杂度。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: nums = [3,3,7,7,10,11,11]
输出: 10
提示:
题解
一看时间复杂度是,估计就是二分了,结果想的还是不对❎啊!好蠢!
全数组的二分查找
假设只出现一次的元素位于下标x
,由于其余每个元素都出现两次,因此下标x
的左边和右边都有偶数个元素,数组的长度是奇数。
nums = [3,3,7,7,10,11,11];
以数组nums
为例,由于数组是有序的,因此数组中相同的元素一定相邻。对于下标x
左边的下标y
,如果nums[y]=nums[y+1]
(比如nums[0]=nums[1]=3
,nums[2]=nums[3]=7
),则y
一定是偶数;对于下标x
右边的下标 z
,如果 nums[z]=nums[z+1]
(比如nums[5]=nums[6]=11
),则 z
一定是奇数。由于下标x
是相同元素的开始下标的奇偶性的分界,因此可以使用二分查找的方法寻找下标x
。
初始时,二分查找的左边界是0
,右边界是数组的最大下标。每次取左右边界的平均值mid
作为待判断的下标,根据mid
的奇偶性决定和左边或右边的相邻元素比较:
如果mid
是偶数,则比较 nums[mid]
和 nums[mid+1]
是否相等;如果 mid
是奇数,则比较
nums[mid−1] 和 nums[mid] 是否相等。
如果上述比较相邻元素的结果是相等,则
mid
<
�
mid
≥
�
mid≥x,调整右边界。调整边界之后继续二分查找,直到确定下标
�
x 的值。
得到下标
�
x 的值之后,
nums
[
�
]
nums[x] 即为只出现一次的元素。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array/solution/you-xu-shu-zu-zhong-de-dan-yi-yuan-su-by-y8gh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。