问题描述
我正在使用分而治之的策略来解决多数问题。 如果重复的次数超过n / 2次,则表示为多数的元素,其中n是输入中给定的元素数量。 如果存在多数元素,则返回1,否则返回0。
这是我正在使用的算法:- ->我们将继续将数组分成两半,直到达到大小为2的数组,然后比较每个数组的两个元素。 ->如果它们相同,则它们是该数组的多数元素,我们将返回它们的值。 ->如果它们不同,我们将返回一个特殊字符以表示没有多数元素。 ->以递归方式向上移动数组,我们将检查从两个子数组/一半获得的值。与上面的基本情况一样,如果元素相同,则返回它们,否则返回特殊字符(在下面的代码中特殊字符为-1)。
//Function to count the number of occurences of an element in the input in linear time
ll simple_count(vector<ll>&v,ll p){
ll count = 0;
for(ll i=0;i<v.size();i++){
if(v[i]==p)
count++;
}
return count;
}
//Function to find the majority element using the above algorithm
ll majorityElement(vector<ll>&v,ll left,ll right){
if(left==right)
return v[left];
if(left+1==right){
if(v[left]==v[right])
return v[left];
return -1;
}
ll mid = left+(right-left)/2;
ll p = majorityElement(v,left,mid);
ll q = majorityElement(v,mid+1,right);
if(p!=-1&&q==-1)
{
if(simple_count(v,p)>((ll)v.size()/2))
return p;
return -1;
}
else if(p==-1&&q!=-1)
{
if(simple_count(v,q)>((ll)v.size()/2))
{
return q;
}
return -1;
}
else if(p!=-1&&q!=-1){
ll p_count = simple_count(v,p);
ll q_count = simple_count(v,q);
if(p_count>q_count&&p_count>v.size()/2)
return p;
else if(q_count>p_count&&q_count>v.size()/2)
return q;
return -1;
}
else if(p==q&&p!=-1)
{
if(simple_count(v,p)>(ll)v.size()/2)
return p;
return -1;
}
else if(p==q)
return -1;
}
int main(){
ll n;
cin>>n;
vector<ll>v(n);
for(ll i=0;i<n;i++)
cin>>v[i];
ll k = majorityElement(v,v.size()-1);
if(k==-1)
cout<<0;
else
cout<<1;
return 0;
}
我面临的问题是这段代码给了我一些输入超出时间限制(TLE)的错误(Coursera分级机不共享我们遇到错误的输入)我相信我的代码的时间复杂度是O(nlogn)。请帮助我优化代码,以使该程序不给我TLE。
输入格式:第一行包含一个整数n,后跟n个非负整数(a1,a2 .... an)。 1
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)