摩尔投票算法

摩尔投票算法也叫多数投票算法

摩尔投票法,解决的问题是如何在任意多的候选人中,选出票数超过一半的那个人。注意,是超出一半票数的那个人。

假设投票是这样的,[A, C, A, A, B],ABC 是指三个候选人。
第一张票与第二张票进行对坑,如果票不同则互相抵消掉;
接着第三票与第四票进行对坑,如果票相同,则增加这个候选人的可抵消票数;
这个候选人拿着可抵消票数与第五张票对坑,如果票不同,则互相抵消掉,即候选人的可抵消票数 -1。

动画演示

应用

来源:leetcode 剑指offer 39

题目:求数组中出现次数超过一半的数字
要求:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

代码

//摩尔投票
int majorityElement(int* nums, int numsSize)
{int count = 0;int res = 0;for (int i = 0; i < numsSize; ++i){if (count == 0){++count;res = nums[i];}else if (nums[i] == res){++count;}else{--count;}}return res;
}

测试截图

摩尔投票算法进阶版

来源:leetcode.229

题目:给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
示例 1
输入:[3,2,3]
输出:[3]
示例 2
输入:[1,1,1,3,3,2,2,2]
输出:[1,2]

超过n/3的数最多只能有两个。先选出两个候选人A,B。 遍历数组,分三种情况:

1、如果投A(当前元素等于A),则A的票数++;
2、如果投B(当前元素等于B),B的票数++;
3、如果A,B都不投(即当前与A,B都不相等),那么检查此时A或B的票数是否减为0:
3.1、 如果为0,则当前元素成为新的候选人;
3.2 、如果A,B两个人的票数都不为0,那么A,B两个候选人的票数均减一;

遍历结束后选出了两个候选人,但是这两个候选人是否满足>n/3,还需要再遍历一遍数组,找出两个候选人的具体票数。

动画演示

代码

int* majorityElement(int* nums, int numsSize, int* returnSize)
{int count1 = 0;int count2 = 0;int res1 = 0; //候选人1int res2 = 0; //候选人2int* arr = (int*)malloc(sizeof(int) * 2);for (int i = 0; i < numsSize; ++i){if (res1 == nums[i]){++count1;continue;}if (res2 == nums[i]){++count2;continue;}// 第1个候选人配对if (count1 == 0){res1 = nums[i];++count1;continue;}// 第2个候选人配对if (count2 == 0){res2 = nums[i];++count2;continue;}--count1;--count2;}// 找到了两个候选人之后,需要确定票数是否满足大于 N/3count1 = count2 = 0;for (int i = 0; i < numsSize; ++i){if (nums[i] == res1)++count1;else if (nums[i] == res2)++count2;}if (count1 > (numsSize / 3) && count2 > (numsSize / 3)){arr[0] = res1;arr[1] = res2;*returnSize = 2;return arr;}else if (count1 > (numsSize / 3)){arr[0] = res1;*returnSize = 1;return arr;}else if (count2 > (numsSize / 3)){arr[0] = res2;*returnSize = 1;return arr;}*returnSize = 0;return arr;}

测试截图

总结

如果至多选一个代表,那他的票数至少要超过一半(⌊ 1/2 ⌋)的票数;
如果至多选两个代表,那他们的票数至少要超过 ⌊ 1/3 ⌋ 的票数;
如果至多选m个代表,那他们的票数至少要超过 ⌊ 1/(m+1) ⌋ 的票数。

算法 摩尔投票算法(图解例题)相关推荐

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

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

  2. 理解并实现摩尔投票算法

    闻道有先后,术业有专攻,如是而已.--韩愈<师说> 1 问题定义 首先,摩尔投票算法不是解决一组数求众数问题,它的约束还要多一个.即找到 n 个数中出现次数超过 n/2 的数.也就是说给定 ...

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

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

  4. C语言刷题之摩尔投票法

    目录 1.引入 2.摩尔投票算法 3.基本步骤 摩尔投票法分为两个阶段: 1.抵消阶段 2.检验阶段 4.代码实现 5.扩展沿伸 6.总结 1.引入 我们来看一个问题: 假设有一个无序数组长度为n,要 ...

  5. Boyer-Moore 投票算法

    文章目录 算法概述 题目 k=2 思路 代码 复杂度分析 k=3 思路 代码 复杂度分析 算法概述 摩尔投票算法经常用于求众数的题目,即,求 出现次数>n/k 的数,可以证明,出现次数超过 n/ ...

  6. Boyer-Moore 投票算法小析

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

  7. 2020年 Moore majority vote algorithm 摩尔投票法知多少

    第一眼看到这个题目,想到的是使用Map来统计出现频次,然后遍历找出频次大于n/2的元素. class Solution {public int majorityElement(int[] nums) ...

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

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

  9. 小小算法,可笑可笑——摩尔投票法(集万家之长)

    摩尔投票法 不多说,先上题目. 问题描述:leetcode 229题 给定一个大小为 n 的整数数组,找出其中的所有的出现超过 ⌊ n/3 ⌋ 次的元素. 这还不简单!直接暴力计数,上map,easy ...

最新文章

  1. 《需求分析》读后感之二
  2. 移动互联网的机会-从零创业,半年净赚50万?
  3. sdut-3332 数据结构实验之栈与队列五:下一较大值(一)
  4. 2018年python薪资_2018年国内就业薪资高的7大编程语言排行
  5. Redis 与 zset(sorted set有序集合) 相关的常用命令
  6. OpenShift 4 - 解决 OpenShift 中 elasticsearch 环境的 Log4j 漏洞
  7. jQuery文档操作之删除操作
  8. java运行python脚本_用Java运行Python脚本
  9. 2022 MathorCup 数学建模B题思路解析
  10. LeetCode算法,多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。 多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的....
  11. 切图具体需要切什么内容_什么是切图?网页制作中的切图是什么?
  12. JAVA,OpenCV简单实现“全能扫描王”的功能
  13. 3169: 小万的回文串
  14. 通过API Key免登录访问Grafana
  15. 如何用java股票量化交易接口读取股票数据?
  16. java yyyy-mm-ddthh:mm:ssz,解析格式为YYYY-MM-DDTHH-MM-SSZ的ISO 8601日期时间
  17. [4G5G专题-48]:物理层-无线资源映射RE Mapping
  18. MBIST --- PATR2.Memorybist 测试流程
  19. office2010官方下载 免费完整版
  20. 饥荒联机版好友服务器未响应,饥荒联机版机器人wx-78使用心得

热门文章

  1. iphone个人热点无法开启_无法在 iPhone 上正常使用“个人热点”怎么办?
  2. 网页中竖的目录怎么改成横的_一点基础也没有,想快速练漂亮硬笔字,先练什么?怎么练进步明显?...
  3. java连接mysql时区修改_java连接mysql数据库时的时区设置问题(time_zone)
  4. 东北大学c语言编程尸体,东北大学c语言编程试题及其答案
  5. php是什么电荷,科学网—蛋白质的表面静电势、ζ-电位和表面电荷 - 朱俊向的博文...
  6. java rest httpclient_Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)...
  7. 微信服务号+支付+php,微信服务号发送营销红包给关注用户步骤及部分php代码
  8. django ipython shell_希望能早点了解的Django性能优化技巧
  9. Gson 转化为带反斜杠的json
  10. 如何设置谷歌浏览器在新窗口中打开搜索链接