【发布时间】:2012-03-02 13:33:27
【问题描述】:
说明
给定一个大小为 (n*k+b) 的数组,其中 n 个元素出现 k 次,一个元素出现 b 次,换句话说,有 n+1 个不同的元素。鉴于 0 < b < k 找到出现 b 次的元素。
我尝试过的解决方案
显而易见的解决方案将使用散列,但如果数字非常大,它将不起作用。复杂度是
O(n)使用 map 存储每个元素的频率,然后遍历 map 以查找出现 b 次的元素。由于 Map 实现为高度平衡的树,复杂性将为
O(nlogn)。
我的两个解决方案都被接受了,但面试官想要一个不使用散列的线性解决方案,并且他给出的提示是使树的高度在您存储频率的树中保持不变,但我无法找出正确的解决方案还没有。
我想知道如何在没有哈希的情况下在线性时间内解决这个问题?
编辑:
示例:
输入:n=2 b=2 k=3
数组:2 2 2 3 3 3 1 1
输出:1
【问题讨论】:
-
请注意,您的解决方案是
O((n*k+b)logn),而不是O(nlogn)- 考虑到问题的条款。 -
你能给出一个包含样本值的样本数组吗?
-
我怀疑面试官想听到类似trie 的内容。但这很愚蠢。特里树的高度至少和
O(logn)一样大,所以如果你可以说它是一个“常数” -O(logn)也是如此 -
你确定面试官的意思吗?比如关于元素范围的任何提示?如果它们的范围在 [0..n-1] 范围内,则解决方案很明显。
-
是的,我确定....我确认只有时间....数字是随机的,不一定在 1 到 n 之间。