【算法】已知必存在众数,求该众数 -- Boyer-Moore 投票算法

25 篇文章 1 订阅
14 篇文章 0 订阅

在这里插入图片描述

  • LeetCode的思路演绎
    在这里插入图片描述
  • 算法思路

题意:必存在众数 -》 在一个数组中,有一个数拥有找过一半的占有率,这个数记为A
若A和其他数组中的数进行选举,投票人只能是数组中的数。则A必赢(因为人数上已经过半)。
解题的关键就是:找到票数最高的人。

  • 改动LeetCoded的演绎
/**
 * @Author james
 * @Date 2019/7/10
 * @Description 求数组中的众数 - Boyer-Moore投票法
 */
public class Solution3 {
    public int majorityElement(int[] nums) {
    	// 数组第一个数就是候选人,肯定给自己投票,票数为1
    	int ret = nums[0];
        int power = 1;
        
        // 只有一个人,票数投给自己,直接成为众数
        if (nums.length == 1) {
            return ret;
        }
		
		/*
		从第一个数后面开始投票,表决前一个数是否应该成为候选人。 
		数值相等票数 +1 数值不等票数-1, 即不认为上一个人应该成为候选人。
		将上一个候选人的票数清零,自己可以成为候选人,拥有获得多一票的权利。
		遍历的过程中,数A必然成为候选人,而且任由除A数外所有人反对,票数到最后一定是正数。
		正数不清零,到最后则为最终候选人。
		*/
        for (int i = 1; i < nums.length; i++) { 
            if (nums[i] == ret)
                power++;
            else
                power--;
			
			// 新晋候选人
            if(power == 0){
                ret = nums[i];
                power = 1;
            }
        }
        return ret;
    }
}

  • 复杂度
    需要遍历数组的所有元素,时间复杂度为O(n)
    没有随着数据量增大而变多的变量,空间复杂度为O(1)
    是本题的最佳解法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值