【发布时间】:2018-07-28 05:29:07
【问题描述】:
这是一道面试题。
我得到了一个 n+1 范围内的整数数组 [1,n]。数组的属性是它有k (k>=1)重复,每个重复可以出现两次以上。任务是在尽可能好的时间和空间复杂度中找到多次出现的数组元素。
在经历了巨大的挣扎之后,我自豪地提出了占用O(1) 空间的O(nlogn) 解决方案。我的想法是将范围[1,n-1] 分成两半,并确定两半中哪一个包含更多来自输入数组的元素(我使用的是鸽洞原理)。该算法递归地继续,直到达到间隔[X,X],其中X 出现两次,即重复。
面试官很满意,但后来他告诉我,存在O(n) 常数空间的解决方案。他慷慨地提供了一些提示(与排列有关的东西?),但我不知道如何提出这样的解决方案。假设他没有说谎,任何人都可以提供指导吗?我已经搜索过,发现这个问题很少(更容易)变体,但不是这个特定的变体。谢谢。
编辑:为了让事情变得更复杂,面试官提到不应该修改输入数组。
【问题讨论】:
-
你不能把所有整数放在一个映射中,数字作为键,出现作为值,然后遍历所有键,我认为这将是 O(n),但也是 O(n ) 空间。
-
@maraca 至少是
O(n)空间。 -
啊,我明白了,如果没有重复项,并且如果已经存在具有该值的元素,那么您可以通过在正确位置插入元素来进行排序,它应该让您找到重复项。
-
如何在 O(n) 时间和 O(1) 空间中排序?
-
连一点可逆修改都没有? (比如让一个元素变成负数)?
标签: arrays algorithm time-complexity big-o space-complexity