高频面试考点--主要元素(用O(n)+O解决)

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高频面试考点--主要元素(用O(n)+O解决)相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述

题目解析

依据题意,主要元素一定是众数(因为主要元素出现次数一定大于数组的一半大小),但是众数不一定就是主要元素,所以我们的思路是先求出众数,再通过确定的众数扫描次数是否符合主要元素的情况。

关于寻找众数,一直有一个非常好的算法–摩尔投票法(能实现时间复杂度O(n),空间复杂度O(1))

  • 曾经在评论区看到过的形象描述:
    摩尔投票法:

  • 核心就是对拼消耗

玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。

那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。

最后能剩下的必定是自己人。

解题代码

效率还行
image.png

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count = 1;
        int res = nums[0];
        int sz = nums.size();
        //防止特殊情况i+1溢出,在后面加一个最后数字。
        int a = nums.back();nums.push_back(a);
        for(int i = 1;i<sz;i++){
            //友军,增加兵力
            if(res == nums[i])
                count++;
            else{//敌军,开始对拼消耗
                count--;
                //当敌军和友军正好同归于尽,则呼叫下一轮兵种
                if(count==0)
                    res = nums[i+1];
            }
        }
//最终对拼得出的res就是众数,再来一层for循环寻找众数出现的次数,如果次数大于sz的一半便是主要元素
        count = 0;
        for(int i=0;i<sz;i++){
            if(nums[i]==res)
                count++;
        }
        return count>(sz/2)?res:-1;
    }
};

以上是关于高频面试考点--主要元素(用O(n)+O解决)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode高频算法面试题 最长回文子串

高频面试考点(考察分治法):合并k个排序链表

C++春招面试高频考点汇总

面试高频算法精简总结

高频算法面试题_旋转字符串(完整的代码实现)

4-2 Python面试常考算法