【发布时间】:2016-06-03 22:15:38
【问题描述】:
我在最近的一次采访中被问到这个问题。
给你一个包含一百万个元素的数组。除了一个之外,所有元素都是重复的。我的任务是找到独特的元素。
var arr = [3, 4, 3, 2, 2, 6, 7, 2, 3........]
我的方法是在for 循环中遍历整个数组,然后创建一个map,其索引为数组中的number,value 作为出现次数的frequency在数组中。然后再次循环遍历我们的地图并返回值为 1 的索引。
我说过我的方法需要O(n) 时间复杂度。面试官告诉我要在低于O(n) 的复杂度内优化它。我说我们不能,因为我们必须遍历包含一百万个元素的整个数组。
最后,他似乎不满意,转入下一个问题。
我知道遍历数组中的数百万个元素很昂贵,但是如果不对整个数组进行线性扫描,我们怎么能找到唯一的元素呢?
PS:数组未排序。
【问题讨论】:
-
我们对数组还有什么了解吗?排序了吗?我们知道数组中有哪些唯一值吗?您目前花费 2n 时间遍历数组的每个元素,然后是映射的每个键,并且可以通过从映射中删除键来避免第二次循环,因为您注意到重复,但
O(2n)仍然是O(n)。 -
@AndrewRueckert - 它没有排序。数组只是包含以某种随机顺序重复的所有数字,但只有一个数字不会重复。
-
您确定他们说的是 O(n) 时间 复杂度,而不是 O(n) 空间 复杂度吗?你知道重复元素有多少个重复项吗?
-
@user2357112 - 他们说的是时间复杂度,而不是在这里处理空间复杂度。重复可能出现任意次数
-
您必须查看所有 n 个元素(最坏的情况,可能会有其他情况可以扣除)。您查看的最后一个可能表明您当前的候选人是重复的。面试官可能对你的解释和测试不满意。