假设我有一个N
整数数组。我需要找到在数组中至少K
次出现的整数。我可以使用O(N)
内存在O(1)
进行此操作吗?
显然,我可以对数组进行排序或使用哈希映射。我可以做得更好吗?
答案 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)内存求解。
替代方案(正如您所建议的那样,只是添加复杂性信息):
O(nlogn)
时间,非常少的额外空间O(n)
平均病例时间,O(n^2)
最差病例时间,O(n)
空间。请注意,由于元素清晰度的降低,您甚至无法判断任何号码是否会出现k
次或更多次出现限制,更不用说找到它或计算方式其中很多都存在。