摩尔投票法

题目描述

给定一个大小为 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;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 摩尔投票法又叫多数投票法。 解决的问题如何在任意多的候选人中,选出获得票数最多的那个 算法包括两个阶段 1. 对抗...
    缸里有绿粥阅读 5,823评论 0 0
  • 摩尔投票法的基本问题 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2...
    9_SooHyun阅读 1,150评论 0 1
  • 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。 示例 1: 输入:...
    修行者12138阅读 2,924评论 0 0
  • 提问: 给定一个int型数组,找出该数组中出现次数大于数组长度一半的int值。 解决方案: 遍历该数组,统计每个i...
    Jimmy5Zhang阅读 13,448评论 3 5
  • 问题描述 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 说明: 要求算法的时间复杂...
    zsdy阅读 3,914评论 0 0