寻找数组中出现次数超过一半以上的元素
可能是最清晰的题解了
给定一个数组,找出出现次数超过一半以上的元素,如果不存在这样的元素,返回 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; }