此数组中的所有其他整数出现n
次。我们有n>m
。
此数组中的所有元素都是整数。你能设计一个适用于O(N)
的算法,其中N
是数组中元素的数量,同时最小化空间复杂度?在最好的情况下,空间复杂度可以限制为O(log(m))
。
特殊情况为n=2
和m=1
(这很容易)。是否存在可以处理任意m
和n
的广义算法?
感谢
答案 0 :(得分:1)
您可以使用将数组中的数字映射到出现次数的哈希表。您可以遍历数组,增加每个数字的出现次数。然后,您可以遍历哈希表,搜索出现n
次的密钥。
答案 1 :(得分:1)
如果阵列的长度> m,然后在数组中的随机元素上转动。找到长度为m(mod n)的数组的一半,并在该半部分重复。
预计运行时间为O(N),需要额外存储O(1)。
答案 2 :(得分:0)
以下算法可能是您正在寻找的。基本上,你创建一个地图,其中键作为整数值,值作为发生次数。你只需循环一次数组,只要数字出现不止一次,你就增加它的数量
public static void findCount (int[] array,int m, int n){
if(m>n){
thrown new IllegalArgumentException("m is greater than n");
}
Map<Integer,Integer> intCount = new HashMap<Integer,Integer>();
for(int i = 0; i<array.length; i++){
if (!intCount.containsKey(array[i])) intCount.put(array[i], 0);
intCount.put(array[i], intCount.get(array[i]) + 1);
}
for (Map.Entry<String,Integer> entry : words.entrySet()) {
Integer key = entry.getKey();
Integer value = entry.getValue();
if(value==m){
System.out.println("Value "+key+" Occurs "+value+" times");
}
}
}
答案 3 :(得分:0)
情况n = 2,m = 1可以通过在阵列A中将所有数字一起x来完成。
这个想法可以通过计算(模n)A中第i位的元素数来推广。当且仅当答案的第i位被设置时,该计数才为非零。
这为您提供了使用O(log(n))附加存储来计算解决方案的O(N.log(max(A)))方法。
这不能实现问题中给出的O(log(N))运行时和O(log(m))存储复杂性,但这似乎是一种有趣的方法。