制作一个算法来查找在2n数组中重复n次的元素

时间:2011-05-06 02:54:45

标签: array-algorithms

创建算法以找到在2n数组中重复n次的元素 我用二叉树实现了,每个节点都有一个与之关联的计数器。返回具有最大计数的节点。任何身体都有比这更好的最佳解决方案。

3 个答案:

答案 0 :(得分:1)

这对于一个真正的问题似乎微不足道,但这就是我要做的 - 可能不是最佳解决方案,但这是我能想到的最简单的。

首先你说你需要找到一个出现n次的元素,但你没有提到是否要检查是否有任何项目出现n次。所以我假设我们知道数组中有一个项目。

arr[0..2n-1]  //some array with 2n elements
quicksort(arr);    
if (arr[n] == arr[n-1])
  return arr[n]
else if (arr[n-1] == arr[0])
  return arr[0]
else 
  return arr[n]

这应该有效,因为在大小为2n的排序数组中,所有n个元素将在一起,所以你只有这三个选项:

  1. 元素在前n个元素中重复,即(arr [0] == arr [n])或
  2. 元素位于数组中间的某个位置,这意味着中心元素必须相同(arr [n] == arr [n-1])
  3. 和显而易见的
  4. 现在怎么办如果我们不知道是否有任何元素出现n次,我们必须检查所有可能的候选者(中间到元素)

    arr[] //with 2n elemenets
    counter1 = 0;
    counter2 = 0;
    quicksort(arr);
    for (i=0; i<2n ;i++){
      if (arr[i]==arr[n-1]) counter1++;
      if (arr[i]==arr[n]) counter2++;
    }
    if (counter1 == n) return arr[n-1]
    if (counter2 == n) return arr[n]
    return "bummer"
    
    PS:像这样的东西真的很有趣,而且非常适合掌握编程。我希望您尝试其他一些方法来解决这个问题。

答案 1 :(得分:0)

这与Find the majority element in array类似。时间复杂度为O(n),因为它需要在数组上进行两次传递。

修改后的代码如下:

int findMajorityElement(int * arr, int size) { //size is 2n in this example
    int count = 0, i, majorityElement;
    for (i = 0 ;  < size ; i++) { // 1st pass
        if(count == 0) {
            majorityElement = arr[i];
        }
        if(arr[i] == majorityElement) 
           count++;
        else 
           count--;
      }
    count = 0;
    for (i=0; i < size ; i++) { // 2nd pass
        if (arr[i] == majorityElement) {
            count++;
        }
    if ( count == size/2) {
        return majorityElement;
    }
    else return -1; //no such element is present
}

答案 2 :(得分:0)

包括

main()的

{

int arr[10],i,res,count=0;

printf("Enter the array elements:\t");

for(i=0;i<10;i++)

scanf("%d",&arr[i]);

for(i=0;i<8;i++)

{

    if(arr[i]==arr[i+1] || arr[i]==arr[i+2])

     {

         res=arr[i];

         break;

     }

    else if(arr[i+1]==arr[i+2])

    {

        res=arr[i+1];

        break;

    }

}

for(i=0;i<10;i++)

  if(arr[i]==res)

   count++;

if(count==5)

 printf("true, no. repeated is:\t%d",res);

else printf("false");

return 0;

}

上面的代码也给出了正确的输出。我不知道为什么我们要使用复杂的代码。如果我错了,请纠正我。