如何查找至少出现K次的数组项

时间:2014-12-29 11:10:40

标签: arrays algorithm

假设我有一个N整数数组。我需要找到在数组中至少K次出现的整数。我可以使用O(N)内存在O(1)进行此操作吗?

显然,我可以对数组进行排序或使用哈希映射。我可以做得更好吗?

2 个答案:

答案 0 :(得分:2)

如果说最大数量仅为10 ^ 5,则制作频率数组F [10 ^ 5 + 1]并执行以下操作,假设数字在arr [](基于0的索引)中。矢量< int> ans存储你的答案。

vector< int >ans;
for( i = 0 ; i <= 100000 ; i++ ) F[i] = 0;
for(i=0 ; i < N ; i++ )
{
    F[arr[i]]++;
    if(F[arr[i]]==K)
    {
         ans.push_back(i);
    }
}

时间复杂度是O(N)并且常量存储器(如果整数总是<= 10 ^ 5,则为10 ^ 5的数组)除了ans之外,在最坏的情况下可以采用O(N)存储器但是你可以&对此做任何事情。

答案 1 :(得分:1)

,您无法在O(n)和O(1)时间内完成此操作而不对输入进行任何限制。

这是element distinctness problem的概括(元素清晰度基本上是k=2的问题),并且在O(n)时间内无法用O(1)内存求解。

替代方案(正如您所建议的那样,只是添加复杂性信息):

  1. 排序和迭代 - O(nlogn)时间,非常少的额外空间
  2. 使用基于哈希表的直方图来计算每个元素的出现次数。 O(n)平均病例时间,O(n^2)最差病例时间,O(n)空间。
  3. 请注意,由于元素清晰度的降低,您甚至无法判断任何号码是否会出现k次或更多次出现限制,更不用说找到它或计算方式其中很多都存在。