文章目录

  • 算法概述
  • 题目
    • k=2
      • 思路
      • 代码
      • 复杂度分析
    • k=3
      • 思路
      • 代码
      • 复杂度分析

算法概述

摩尔投票算法经常用于求众数的题目,即,求 出现次数>n/k 的数,可以证明,出现次数超过 n/k 的数最多只有 k-1 个。否则必然违背「数总共只有 n 个」或者「当前统计的是出现次数超过 n/k 的数」的前提条件。

  • 我们可以设定 k-1 个变量来记录最终结果。
  • k-1=3 为例,所求结果设为 k1k2,用两个变量 n1n2 分别记录 k1k2 的出现次数。遍历给定的数组 nums,设 当前便利的到的元素为 nums[i] ,分情况处理:
    1. n1==0,此时需要更换 k1k1=nums[i]
    2. n2==0,此时需要更换 k2k2=nums[i]
    3. n1>0nums[i]==k1n1++
    4. n2>0nums[i]==k2n2++
    5. 不属于以上四种情况则表明,n1>0n2>0nums[i]!=k1nums[i]!=k1 ,即 nums[i] 不等于 k1 也不等于 k2,同时 k1k2 的出现次数大于 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 投票算法相关推荐

  1. Boyer–Moore majority vote algorithm(摩尔投票算法)

    Boyer–Moore majority vote algorithm 摩尔投票算法 Leetcode15: https://leetcode.com/problems/majority-elemen ...

  2. 摩尔投票法(Boyer–Moore majority vote algorithm)

    参考资料 论文MJRTY A Fast Majority Vote Algorithm 算法演示网站 维基百科 算法解读 概述 摩尔投票法(Boyer–Moore majority vote algo ...

  3. C语言实现boyer moore(博伊尔-摩尔搜索)算法(附完整源码)

    boyer moore博伊尔-摩尔搜索算法 实现以以下相关接口 boyer moore博伊尔-摩尔搜索算法的完整源码(定义,实现,main函数测试) 实现以以下相关接口 int max(int a, ...

  4. leetcode 229. Majority Element II(多数投票算法)

    就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public:vector<int&g ...

  5. java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...

    摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...

  6. Boyer-Moore 投票算法小析

    今日get到摩尔投票算法,时间和空间复杂度都得到了最优的结果,觉得非常经典,在此记录,以备今后查阅,同时希望对和我一样的初学者起到抛砖引玉的效果. CiterSeerX上论文链接: https://c ...

  7. Boyer–Moore BM 后缀匹配算法

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  8. 【KMP】572: Boyer–Moore–Horspool algorithm

    题目: http://acm.swust.edu.cn/#/problem/572/490 题目描述 题目内容来自:https://en.wikipedia.org/w/index.php?title ...

  9. oracle+rac+算法,Oracle RAC中的投票算法

    两个partition都想以为对方出问题,自己需要接管业务,如果没有投票算法就会导致两个partition同时操作数据库(共享存储)的情况 假设,RAC集群中有三台机器,A,B,C A,B,C都会有3 ...

  10. 算法整理:Boyer-Moore 投票算法

    1,基本思想 Boyer-Moore 投票算法的基本思想是:在每一轮投票过程中,从数组中删除两个不同的元素,直到投票过程无法继续,此时数组为空或者数组中剩下的元素都相等. 如果数组为空,则数组中不存在 ...

最新文章

  1. 【MongoDB】MongoDB备份方法
  2. Tomcat类加载器机制
  3. 第一篇博客---JavaSE基础部分回顾总结01概述、基础语法
  4. S5PV210 芯片降价
  5. Java输出表格格式_在Java的System.out中以表格式输出
  6. 【HDOJ7079】Pty loves lines(计算直线的交点方案数,打表)
  7. Mesos超配:让集群利用率可以达到100%
  8. 《推荐系统实践》协同过滤算法源代码
  9. 使用maven官方仓库直接下载项目需要的jar包方法
  10. linux 操作mysql 命令_linux下mysql操作命令大全
  11. python3 中 sort 方法与 sorted 函数的使用
  12. CF gym Coins(01背包计数)
  13. 蜗牛星际A单开启WOL功能
  14. Elastic:data_hot,data_warm,data_cold角色有什么用
  15. 都2022年了 究竟什么叫旗舰手机?
  16. oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用
  17. 一、AUTOSAR概述
  18. 余弦公式在c语言里面怎么用_C语言中求余弦值的相关函数总结
  19. 小米 11 的重点,和充电器无关
  20. Python3-word文档操作(十):利用docx库创建word文档,添加段落,添加表格,添加图片,设置文字粗体,斜体

热门文章

  1. python公式如何编写_如何编写 Python 程序,资深Python大咖教你玩转Python
  2. solr 7 mysql导入_solr 7.7.0 windows 导入mysql数据库数据
  3. k均值聚类算法优缺点_Grasshopper实现K均值聚类算法
  4. python中的引用怎么理解_Python函数通过引用调用
  5. LSGO软件技术团队对外技术交流
  6. 【转】Ubuntu Desktop下自动启动终端并运行脚本
  7. 【转】03.Dicom 学习笔记-DICOM C-Get 消息服务
  8. SharePoint 2010 WSP包部署过程中究竟发生什么?
  9. linux octave源码安装,在Linux操作系统上安装Octave的方法
  10. Nginx报错:nginx: [emerg] CreateFile() nginx.conf“ failed (3: The system cannot find the path specified