算法: 摩尔投票算法(Moore majority vote algorithm) 【数组中出现次数超过一半的数字】

摩尔投票算法是线性时间复杂度的流算法,用于在元素序列中查找出现次数超过一半的元素。通过正负抵消原理,将与参照元素不同的数字抵消,最后留下的可能是出现次数最多的数字。算法流程包括设置参照数字和计数器,遍历过程中根据计数器和比较结果调整计数器和参照数字,最终得到结果。
摘要由CSDN通过智能技术生成

算法背景:

Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O(n)和空间复杂度的情况下,在一个元素序列中查找包含最多的元素。
它是以Robert S.Boyer和J Strother Moore命名的,1981年发明的,是一种典型的流算法(streaming algorithm)。
在它最简单的形式就是,查找最多的元素,也就是在输入中重复出现超过一半以上(n/2)的元素。
如果序列中没有最多的元素,算法不能检测到正确结果,将输出其中的一个元素之一。

算法介绍

  1. 基本题目形式为:找出数组中出现次数超过一半的数字
  2. 核心理念为 “正负抵消”
  3. 时间和空间复杂度分别为 O(N) 和O(1) ;

算法理解

  1. 正负抵消
    对于正负抵消的理解为消除相异的数字
    因为存在出现次数超过一半的数字,该数字个数必定大于等于与其不同的数字个数。
    所以,将参照数字与与其不同的数字抵消。如此,最后留下的一个必定是出现次数最多的(若存在)。
  2. 抵消方式:
    设置计数器,当前比较对象若与参照对象相同,则+1,若不同,则-1。抵消成0时将下一个数字作为新参照。

LeetCode上图解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值