春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
打擂算法:传送门
该算法很好地将一般需要O(nlogn)时间复杂度得到的结果减少成O(n),但是前提条件是出现最多的数的出现次数大于(不包括等于)集合中个数的一半。
float mostElement(vector<float> v){
int count = 0;
float m;
for(int i=0;i<int(v.size());i++){
if(count ==0||m == v[i]){
m = v[i];
count++;
}else{
count--;
}
}
return m;
}
该算法的关键在于count++、count--。假设最多出现次数的值为a,在遍历时,当m==a,遇到新的a会起促进作用;当m!=a时,新的a起消极作用。因为a的个数大于集合个数的一半,到最后时,count一定大于0且m==a。
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(