这是算法http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html 这是我的代码
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int ans,counter=0,a,temp=0,time=0;
while(temp<n){
cin>>a;
if(counter==0)
{
counter=1;
ans=a;
}
else if(counter>0){
if(ans==a)
++counter;
else
--counter;
}
++temp;
}
cout<<"The number "<<ans<<" is in the more majority ";
}
我的问题是 当你给6 6 1 2 3 它说3占多数
我的问题在哪里? 感谢
答案 0 :(得分:2)
您正确实施了算法,但您没有正确解释它。
该算法假定存在多数元素(超过一半的元素是特定元素)并返回它。如果假设是假的,你必须经历两次整个序列以检查是否确实存在多数。
在您的示例中没有多数,因此算法无效。
答案 1 :(得分:1)
我认为你得到了给定数据的预期答案。关键是来自链接页面的引用:
“当我们完成时,当前的候选人是多数元素,如果 占多数。“
在这种情况下,没有多数,因此算法返回无效结果。请尝试输入6 6 6 1 2
这是一个没有教授不可接受的数组的实现:
#include <iostream>
using namespace std;
int majority(int n,int &ans,int counter){
int a,i;
if (!n) return 0;
cin>>a;
if (!counter) ans=a;
counter+=2*(ans==a)-1;
i=majority(n-1,ans,counter);
return i+(ans==a);
}
int main(){
int n,ans;
cin>>n;
if (n/2 < majority(n,ans,0))
cout<<"The number "<<ans<<" is in the more majority "<<endl;
else
cout<<"No majority"<<endl;
}