当前位置: 首页 >文章 > 摩尔投票算法解主要元素
收藏
分享

摩尔投票算法解主要元素

举报小虎转载君小虎转载君发布于 2021-07-10659阅读0点赞
我们可以使用摩尔投票算法来解,维基百科对摩尔投票算法是这样解释的。...

This world may be rough around the edges, but it’s got its charms.

这个世界可能很粗野,但有其魅力所在。

问题描述

来源:
LeetCode面试题 17.10

难度:简单

数组中占比超过一半的元素称之为主要元素。给你一个整数数组,找出其中的主要元素。若没有,返回-1。请设计时间复杂度为O(N)、空间复杂度为O(1)的解决方案。

示例 1:

输入:
[1,2,5,9,5,9,5,5,5]

输出:
5

示例 2:



输入:[3,2]

输出
:-1

示例 3:



输入:[2,2,1,1,1,2,2]

输出:2

摩尔投票算法解决

这题是让求主要元素,主要元素就是在数组中占比超过一半的元素。咋一看这题很简单,我们可以通过排序或者使用HashMap都是可以解决的。但这题要求时间复杂度为O(N),空间复杂度为O(1),很明显上面两种方式都不符合要求。

除了上面两种方式我们可以使用摩尔投票算法来解,维基百科对摩尔投票算法是这样解释的。

摩尔投票算法是在集合中寻找可能存在的多数元素,这一元素在输入的序列重复出现并占到了序列元素的一半以上;在第一遍遍历之后应该再进行一个遍历以统计第一次算法遍历的结果出现次数,确定其是否为众数;如果一个序列中没有占到多数的元素,那么第一次的结果就可能是无效的随机元素。对于数据流而言,则不太可能在亚线性空间复杂度的情况下中就寻找到出现频率最高的元素;而对于序列,其元素的重复次数也有可能很低。


上面说了一大堆,主要说了两层意思:

第一就是找出主要元素(不一定有)
第二判断这个数是否是主要元素。

摩尔投票算法的原理就是使用两个变量,一个major记录当前数字,一个count记录当前数字出现的次数,遇到相同的count就加1,遇到不同的就减1,当count小于0的时候,说明前面的都相互抵消完了,major和count都要重新赋值……,最后再判断major是否是主要元素即可。我们来举个例子


假设数组中每个不同的数字就代表一个国家,而数字的个数就代表这个国家的人数,他们在一起混战,就是不同国家每两个人都同归于尽。我们就可以知道那个人数大于数组长度一半的肯定会获胜(假设主要元素存在)。

就算退一万步来说,其他的所有人都来攻击这个人数最多的国家,他们每两个两个同归于尽,最终剩下的也是那个主要元素,(这里有个前提,就是主要元素必须存在),来看下代码

时间复杂度:O(N),两个for循环,不是嵌套的。
空间复杂度:O(1),使用了两个变量。


本文原创,未经作者允许不可转载!
更多内容,欢迎关注作者微信公众号:数据结构和算法!


0条评论
别默默看啦~登录/注册一起参与讨论吧~

暂无评论

请选择举报理由

违反法律法规

侵犯个人权益

有害网站环境

更多训练营>>

为你推荐 · 训练营(全勤打卡报名费全额返累计全额返用户133,673人)

【5月】零基础动态表情包创作训练营
距离开班仅剩12天27人已报名
【6月】人像后期案例实操训练营
距离开班仅剩39天23人已报名
【7月电脑剪映】短视频剪辑入门训练营
距离开班仅剩61天3人已报名
特惠
充值
7折购
今日还在继续学习的你,太棒了!
7
折扣券可用于
年费无限VIP
立 即
使 用
此活动优惠不可与其他活动叠加使用
有效期:000000
消息
登录即可查看消息记录
建议
意见
官方
客服
在线咨询客服热线

您可以与在线客服进行沟通获得帮助

工作日:9:00~22:00节假日:9:00~18:00

联系在线客服

您可以电话联系客服进行沟通获得帮助

工作日:9:30~18:30

400-862-9191
虎课
积分
免费学习89000+个教程!
配套素材、源文件一键下载!
昨日学员已学习了33,301
并提交了258份作业!
登录后立即学习!
loading
微信扫码关注即可登录
您需要同意协议才可以进行登录
登录虎课网,每天免费学课程全站 89000+ 视频会员教程 | 每日可免费学 1
为确保账户信息安全
请先进行真实姓名验证后进行充值付款
立即验证