资料来源:Microsoft面试问题
给定一个排序的数组,其中每个元素都出现两次,但一次只能出现一次,我们需要找到该元素。
现在,标准的O(n)解决方案是对列表进行XOR,这将返回未重复的元素(因为所有重复的元素都被抵消了)。
如果我们知道数组已排序,是否可以更快地解决此问题?
是的,您可以使用排序来降低复杂度,方法O(log n)是进行二进制搜索。
O(log n)
由于对数组进行了排序,因此在缺少元素之前,每个值都占据了数组中的点2*k和位置2*k+1(假定基于0的索引)。
2*k
2*k+1
所以,你到阵列的中间,说指数h,并检查无论是指数h+1,如果h是偶数,或者h-1如果h是奇数。如果缺少元素稍后出现,则这些位置处的值相等,如果之前出现,则值将不同。重复直到找到丢失的元素。
h
h+1
h-1