今天复习数据结构,看到一个算法:求一个序列长度为n的序列中的主元素(元素个数>n/2);
给出的解答是:
int ans(int A[],int n){
int i,c,count=1;
c=A[0];
for(int i=1;i<n;i++){
if(A[i]==c)
count++:
else
if(count>0)
count--;
else{
c=A[i];
count=1;
}
}
/*------------选出候选者c-------------*/
count=0;
for(int i=0;i<n;i++){
if(A[i]==c)count++;
}
if(count>n/2)return c;
else return -1;
}
关于这个算法,在LeetCode等地方做过这个题,所以很眼熟而且觉得很奇怪,怎么加加减减的就把答案求出来了,而且只有在count==0的时候才替换元素,不会再count!=0时把正确答案跳过吗,是不是涉及了什么高深的概率论原理,必然不会跳过呢?
昨天闲的不行,瞎百度了一下,得到了一堆乱七八糟的东西,百度真的很渣,换谷歌搜了一下,哎,更垃圾。。。