Boyer-Moore 投票算法
文章目录
- 算法概述
- 题目
- k=2
- 思路
- 代码
- 复杂度分析
- k=3
- 思路
- 代码
- 复杂度分析
算法概述
摩尔投票算法经常用于求众数的题目,即,求 出现次数>n/k
的数,可以证明,出现次数超过 n/k
的数最多只有 k-1
个。否则必然违背「数总共只有 n
个」或者「当前统计的是出现次数超过 n/k
的数」的前提条件。
- 我们可以设定
k-1
个变量来记录最终结果。 - 以
k-1=3
为例,所求结果设为k1
、k2
,用两个变量n1
、n2
分别记录k1
、k2
的出现次数。遍历给定的数组nums
,设 当前便利的到的元素为nums[i]
,分情况处理:n1==0
,此时需要更换k1
,k1=nums[i]
。n2==0
,此时需要更换k2
,k2=nums[i]
。n1>0
且nums[i]==k1
,n1++
。n2>0
且nums[i]==k2
,n2++
。- 不属于以上四种情况则表明,
n1>0
且n2>0
且nums[i]!=k1
且nums[i]!=k1
,即nums[i]
不等于k1
也不等于k2
,同时k1
、k2
的出现次数大于0
,因此只需将两者的出现次数-1
即可:n1--
、n2--
。
题目
k=2
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
思路
用变量 x
代表要求的最终结果,也就是数组中的众数。
用 sum
代表票数和。
推论一: 若记 众数
的票数为 +1
,非众数
的票数为 -1
,则一定有所有数字的 票数和 > 0
。
推论二: 若数组的前 a 个数字的 票数和 = 0
,则 数组剩余 (n-a)
个数字的 票数和一定仍 > 0
,即后 (n-a)
个数字的 众数仍为 x
。
第一条显而易见,题目讲的很清楚,最终要求的数出现的次数超过这组数字个数的二分之一,因此众数个数大于非众数。
第二条推论中,票数和=0
的情况代表着 这一段中众数个数与非众数个数相等
,因此成立。
而我们不断的割掉推论二中的 票数和=0的一段
,具体做法是(上图中黑字x):每当 sum=0
时,此时将 x
更新为 下一段数字中的首元素
,最终剩下的一段中的 x
即为我们所求的最终结果。
代码
class Solution {public:int majorityElement(vector<int>& nums) {int sum = 0, x;for(int i = 0; i < nums.size(); i++){if(!sum) x = nums[i];sum += nums[i]==x?1:-1;}//加入了验证最终x是否大于数组长度一半的操作//当然在本题中是肯定的int count = 0;for(int& num:nums)if(num==x) count++;return count>nums.size()/2?x:-1;//当无众数时返回-1}
};
复杂度分析
- 空间复杂度O(N):遍历数组。
- 时间复杂度O(1):未开辟新空间。
k=3
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。(LC题目链接)
示例:
输入: [3,2,3]
输出: [3]
思路
如果两个人的票数都超过了三分之一,剩余的票就不到三分之一了,因此最多有两个超过 n/3
的元素。
代码
class Solution {public:vector<int> majorityElement(vector<int>& nums) {// 如果两个人的票数都超过了三分之一,剩余的票就不到三分之一了// 因此最多有两个超过n/3的元素,摩尔投票法vector<int> v;int n1 = 0, n2 = 0, a = 0, b = 0;for(auto i:nums){if(n1>0 && i==a) n1++;else if(n2>0 && i==b) n2++;else if(n1==0){a=i;n1=1;}else if(n2==0){b=i;n2=1;}else{n1--;n2--;}//cout << a << " " << n1 << " " << b << " " << n2 << endl;}int cnt1 = 0, cnt2 = 0;for(auto i:nums){if(n1>0 && i==a) cnt1++;if(n2>0 && i==b) cnt2++;}if(cnt1>nums.size()/3) v.push_back(a);if(cnt2>nums.size()/3) v.push_back(b);return v;}
};
复杂度分析
- 时间复杂度:O(n):其中
n
为数组的长度。 - 空间复杂度:O(1):只需要常数个元素用来存储关键元素和统计次数即可。
Boyer-Moore 投票算法相关推荐
- Boyer–Moore majority vote algorithm(摩尔投票算法)
Boyer–Moore majority vote algorithm 摩尔投票算法 Leetcode15: https://leetcode.com/problems/majority-elemen ...
- 摩尔投票法(Boyer–Moore majority vote algorithm)
参考资料 论文MJRTY A Fast Majority Vote Algorithm 算法演示网站 维基百科 算法解读 概述 摩尔投票法(Boyer–Moore majority vote algo ...
- C语言实现boyer moore(博伊尔-摩尔搜索)算法(附完整源码)
boyer moore博伊尔-摩尔搜索算法 实现以以下相关接口 boyer moore博伊尔-摩尔搜索算法的完整源码(定义,实现,main函数测试) 实现以以下相关接口 int max(int a, ...
- leetcode 229. Majority Element II(多数投票算法)
就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public:vector<int&g ...
- java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...
摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...
- Boyer-Moore 投票算法小析
今日get到摩尔投票算法,时间和空间复杂度都得到了最优的结果,觉得非常经典,在此记录,以备今后查阅,同时希望对和我一样的初学者起到抛砖引玉的效果. CiterSeerX上论文链接: https://c ...
- Boyer–Moore BM 后缀匹配算法
前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...
- 【KMP】572: Boyer–Moore–Horspool algorithm
题目: http://acm.swust.edu.cn/#/problem/572/490 题目描述 题目内容来自:https://en.wikipedia.org/w/index.php?title ...
- oracle+rac+算法,Oracle RAC中的投票算法
两个partition都想以为对方出问题,自己需要接管业务,如果没有投票算法就会导致两个partition同时操作数据库(共享存储)的情况 假设,RAC集群中有三台机器,A,B,C A,B,C都会有3 ...
- 算法整理:Boyer-Moore 投票算法
1,基本思想 Boyer-Moore 投票算法的基本思想是:在每一轮投票过程中,从数组中删除两个不同的元素,直到投票过程无法继续,此时数组为空或者数组中剩下的元素都相等. 如果数组为空,则数组中不存在 ...
最新文章
- 【MongoDB】MongoDB备份方法
- Tomcat类加载器机制
- 第一篇博客---JavaSE基础部分回顾总结01概述、基础语法
- S5PV210 芯片降价
- Java输出表格格式_在Java的System.out中以表格式输出
- 【HDOJ7079】Pty loves lines(计算直线的交点方案数,打表)
- Mesos超配:让集群利用率可以达到100%
- 《推荐系统实践》协同过滤算法源代码
- 使用maven官方仓库直接下载项目需要的jar包方法
- linux 操作mysql 命令_linux下mysql操作命令大全
- python3 中 sort 方法与 sorted 函数的使用
- CF gym Coins(01背包计数)
- 蜗牛星际A单开启WOL功能
- Elastic:data_hot,data_warm,data_cold角色有什么用
- 都2022年了 究竟什么叫旗舰手机?
- oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用
- 一、AUTOSAR概述
- 余弦公式在c语言里面怎么用_C语言中求余弦值的相关函数总结
- 小米 11 的重点,和充电器无关
- Python3-word文档操作(十):利用docx库创建word文档,添加段落,添加表格,添加图片,设置文字粗体,斜体
热门文章
- python公式如何编写_如何编写 Python 程序,资深Python大咖教你玩转Python
- solr 7 mysql导入_solr 7.7.0 windows 导入mysql数据库数据
- k均值聚类算法优缺点_Grasshopper实现K均值聚类算法
- python中的引用怎么理解_Python函数通过引用调用
- LSGO软件技术团队对外技术交流
- 【转】Ubuntu Desktop下自动启动终端并运行脚本
- 【转】03.Dicom 学习笔记-DICOM C-Get 消息服务
- SharePoint 2010 WSP包部署过程中究竟发生什么?
- linux octave源码安装,在Linux操作系统上安装Octave的方法
- Nginx报错:nginx: [emerg] CreateFile() nginx.conf“ failed (3: The system cannot find the path specified