摩尔投票

题目

面试题 17.10. 主要元素

方法

真简单!

哈希表!计数!return! 完活!
……………………………………
等等,题目要求O(1)空间,这……

核心是对拼消耗

  • 我们把这个数组想象成一排士兵,他们来自不同的国家,而且不同国家都是敌对关系,也就是说两两相遇就会开打。
  • 假设从左往右进行车轮战,每个士兵的战斗力相同,即敌对士兵两两开打会两败俱死!定义【势力】为某国士兵的个数,即同国士兵相遇会【势力】+ 1
  • 当车轮战结束后,最后一定是没有人活着,或者活下来的都是同一国家的
  • 那么活下来的势力一定就是参战中势力最雄厚的嘛(指人最多)?不是的,假设总共有2n+1个士兵参战,其中n个属于一方,另n个属于另一方,最后一方势力只有一个人,也许前两方杀红了眼两败俱伤了,最后被剩下的一个人捡漏了也是可能的。
  • 怎么判断这个人是捡漏的呢?人不够多。假如【势力】超过总人数的一半,那绝对不会出现捡漏的。

code:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int alive = 0;//活着的人
        int type = -1;//因为nums是整数数组所以可以初始化为负值
        for(auto& num : nums){
            //没有活着的人
            if(!alive){
                type = num;
                alive++;
            }else{
                if(num == type){
                    alive++;
                }else{
                    alive--;
                }
            }
        }
        if(alive == 0) return -1;
        int ans = 0;
        for(auto& num : nums){
            if(num == type){
                ans++;
            }
        }
        return ans > nums.size() / 2 ? type : -1;
    }
};
posted @ 2021-07-09 17:45  miyanyan  阅读(34)  评论(0编辑  收藏  举报