查找在数组中出现m次的唯一整数

时间:2014-12-29 01:01:58

标签: arrays algorithm

此数组中的所有其他整数出现n次。我们有n>m。 此数组中的所有元素都是整数。你能设计一个适用于O(N)的算法,其中N是数组中元素的数量,同时最小化空间复杂度?在最好的情况下,空间复杂度可以限制为O(log(m))

特殊情况为n=2m=1(这很容易)。是否存在可以处理任意mn的广义算法?

感谢

4 个答案:

答案 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))存储复杂性,但这似乎是一种有趣的方法。