寻找数组中出现次数超过一半以上的元素

可能是最清晰的题解了

给定一个数组,找出出现次数超过一半以上的元素,如果不存在这样的元素,返回 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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务