美文网首页
摩尔投票法

摩尔投票法

作者: simon_kin | 来源:发表于2021-03-15 16:44 被阅读0次

    题目描述

    给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/2 ⌋ 次的元素。

    分析:采用摩尔投票法,两个阶段:抵消阶段和计数阶段

    抵消阶段:两个不同投票进行对抗,并且同时抵消掉各一张票,如果两个投票相同,则累加可抵消的次数;

    计数阶段:在抵消阶段最后得到的抵消计数只要不为 0,那这个候选人是有可能超过一半的票数的,为了验证,则需要遍历一次,统计票数,才可确定

    public static int majorityElement(int[] nums) {
            int len = nums.length;
    
            if (len==0){
                return -1;
            }
    
            int major = 0;
            int vote = 0;
    
            for (int num:nums){
                if (vote==0){
                    major = num;
                    vote = 1;
                }else {
                    if (major==num){
                        vote++;
                    }else {
                        vote--;
                    }
                }
            }
            if (vote==0){
                return -1;
            }
    
            int flag = 0;
            for (int num:nums){
                if (major == num){
                    flag ++;
                    if (flag>len/2){
                        return major;
                    }
                }
            }
            return -1;
        }
    

    相关文章

      网友评论

          本文标题:摩尔投票法

          本文链接:https://www.haomeiwen.com/subject/ijgkcltx.html