寻找数组中出现次数超过一半以上的元素
可能是最清晰的题解了
给定一个数组,找出出现次数超过一半以上的元素,如果不存在这样的元素,返回 0。
在 LeetCode 上看到过类似的问题 ,但是 LeetCode 上的输入保证存在多数元素。
一个团体中在选举首领,每个人都可以为了自己的支持对象而牺牲自己,去带走一个支持别人的人。下面的代码基本上实现了前面的设想
class Solution {
public:
int MoreThanHalfNum(vector<int> numbers) {
int n = 0;
int ret;
for(size_t i=0;i<numbers.size();i++){
if(n == 0){
ret = numbers[i];
n = 1;
}else{
if(ret == numbers[i]){
n ++;
}else{
n--;
}
}
}
return ret;
}
}; 所有人依次进入战场,如果战场空着,自己的支持者暂时获胜,支持者数量为 1。如果战场上已经有一伙的,实力加强。如果不是一伙的就和对方其中一个同归于尽。
拼杀完成后,如果保证某人的支持者过半,那么战场上留下的就是这个人的支持者,支持者手里拿着自己的旗号(数字)。但如果没有任何一个人支持者过半,那么它的支持者会和多个党派的支持者拼杀,最终就算支持者占据 49%,那也可能全部战死。相反,某个人支持者只有一个,他可以最后进入战场。然后发现战场上血流成河,但没有一个活着的。
因此,上面函数的结果,可能不是那个支持者过半的候选者,而是某个让自己的支持者猫在最后才进入战场的家伙。因此,需要做如下判断:
n = count(numbers.begin(), numbers.end(), ret);
if(2 * n > numbers.size()){
return ret;
}else{
return 0;
}
联想公司福利 1543人发布
查看12道真题和解析