创建算法以找到在2n数组中重复n次的元素 我用二叉树实现了,每个节点都有一个与之关联的计数器。返回具有最大计数的节点。任何身体都有比这更好的最佳解决方案。
答案 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个元素将在一起,所以你只有这三个选项:
现在怎么办如果我们不知道是否有任何元素出现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;
}
上面的代码也给出了正确的输出。我不知道为什么我们要使用复杂的代码。如果我错了,请纠正我。