摩尔投票法

不多说,先上题目。

问题描述:leetcode 229题
给定一个大小为 n 的整数数组,找出其中的所有的出现超过 ⌊ n/3 ⌋ 次的元素。

这还不简单!直接暴力计数,上map,easy搞定。
sorry!还有附加条件,忘记码上了>_<

设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。

这下全了>^<如何解呢?空间复杂度O(n)怎么办?
别急,先来个中断,在小本本上记下,咱们先调用摩尔投票法。

摩尔投票法

又叫多数投票算法(Boyer–Moore majority vote algorithm)
出自这篇论文,有兴趣的小伙伴可以看看,锻炼英语。。
这里就用汉语描述一下主要内容。

  • 算法描述

摩尔投票法,算法解决的问题是如何在任意多的候选人(选票无序),选出获得票数最多的那个。在无序且侯选人不定的情形,可运用摩尔投票法,投出一个主席,只要候选人的票数多余一半,就当选。
算法的比较次数最多是选票(记为n)的两倍,可以在 O(n)时间内选出获票最多的,空间开销为O(1)。

  • 算法步骤

算法分为两个阶段:pairing阶段和counting阶段。
pairing阶段(抵消阶段):两个不同选票的人进行对抗,并会同时击倒对方,当剩下的人都是同一阵营,相同选票时,结束。

counting阶段(计数阶段):对最后剩下的下进行选票计算统计,判断选票是否超过总票数的一半,选票是否有效。

这里是我觉得讲的最清楚的算法步骤的一篇文章,没有之一,自愧不如,就分享来给大家看看。把候选人想成数组也太妙了。

怎么办还不懂?

这里有大佬的动画演示,看完秒懂

这个柱状图角度也蛮新颖的

看完一圈回来,相信大家都明白摩尔投票法是什么了。那最初这个题也会解了吧。
这里只给出C++的代码实现

class Solution {public:vector<int> majorityElement(vector<int>& nums) {vector<int> ans;if (nums.empty()) return ans;int cand1, cand2;int count1, count2;cand1 = cand2 = count1 = count2 = 0;// 抵消阶段for (int i = 0; i < nums.size(); i++) {if (nums[i] == cand1) count1++;else if (nums[i] == cand2) count2++;else if (count1 && count2) {count1--;count2--;}else if (!count1) {cand1 = nums[i];count1++;}else {cand2 = nums[i];count2++;}}// 计数阶段count1 = count2 = 0;for (int i = 0; i < nums.size(); i++) {if (nums[i] == cand1) count1++;else if(nums[i] == cand2) count2++; // 必须用else if,保证每个数只算到一个候选人头上else {}}if (count1 > nums.size() / 3) ans.push_back(cand1);if (count2 > nums.size() / 3) ans.push_back(cand2);return ans;}
};

最后总结一下:

1.摩尔投票法的第一步pairing是用来在O(n)时间和O(1)空间内,选出众数来。
2.因为是选出众数,例如在[1,2,3]中,1或2或3都是众数,因此,还需要第二不counting重新再遍历一边,统计选出的的票数是否多余1/2。
3.由此可以推广,如果选出两名主席,则pairing步骤需要找出两个众数,counting需要检查,每个选出来个的主席是否票数都多余1/3。
如果要选出m名主席,要选出m个众的数,检查是否都多余1/(m+1)。
4.还有什么???没了。。。哦对!还有其他解法。
比如:哈希表方法和排序法找中位数(这个只使用选出一个主席的情况哦)
哈希map:

class Solution {public:int majorityElement(vector<int>& nums) {unordered_map<int, int> counts; int n = nums.size();for (int i = 0; i < n; i++)if (++counts[nums[i]] > n / 2)return nums[i];return 0;}
};

排序:

int majorityElement(vector<int>& nums) {sort(nums.begin(),nums.end());return nums[nums.size() / 2];}
参考文章

1.多数投票算法(Boyer-Moore Algorithm)详解
2.摩尔投票法(Boyer–Moore majority vote algorithm)
3.Boyer–Moore majority vote algorithm

小小算法,可笑可笑——摩尔投票法(集万家之长)相关推荐

  1. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(9)集万家之长不死 python

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

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

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

  3. 动态规划和摩尔投票法

    动态规划 维基百科对动态规划(Dynamic programming,简称DP)的定义是一种在数学.管理科学.计算机科学.经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问 ...

  4. 摩尔投票法(力扣- -229. 求众数 II)

    摩尔投票法(力扣- -229. 求众数 II) 文章目录 摩尔投票法(力扣- -229. 求众数 II) 一.题目描述 二.分析 摩尔投票法 总结 三.代码 一.题目描述 二.分析 这道题如果用O(N ...

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

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

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

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

  7. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

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

  8. 【LeetCode笔记】169. 多数元素(Java、摩尔投票法、哈希表)

    文章目录 题目描述 思路 & 代码 思路一:哈希表 思路二: 摩尔投票法 题目描述 好家伙,这是今天最有意思的题目了 思路 & 代码 思路一:哈希表 先说缺点:空间复杂度O(n) 一次 ...

  9. 【学术】集百家之长,有一家之言

    又到了一年一度的和其他博士生交流的时间. 一边听,一边记忆了几个带有总结意味的句子,作为话题之间的天然分界限. 中间穿插的案例,有的是用来佐证话题的,有的可能是临时想起来的.案例信息的准确性没有经过考 ...

最新文章

  1. 赠书福利 | Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
  2. SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
  3. python入门基础代码图-python入门代码指南教程书籍推荐2020总结全集汇总
  4. BOOST_VMD_ASSERT_IS_ARRAY宏相关的测试程序
  5. Oracle数据库中的SOUNDEX函数
  6. Linux使用技巧15则
  7. idea for循环快捷键_IDEA骚技巧,编码速度至少快一倍
  8. HTTP/3 都来了,你却还在用 HTTP/1.1?
  9. 2021年中国成人商店市场趋势报告、技术动态创新及2027年市场预测
  10. 好奇:WayOs破解、OEM、修复、打包等工具大全,满足大家的好奇心发下截图
  11. python自动化办公教程百度云-Python自动化测试视频教程【百度云盘下载】
  12. 国内电影发行公司简介
  13. tyvj p1016 装箱问题( 简单DP 01背包)
  14. 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
  15. 关于BASE编码 16 32 36 58 64 58 91
  16. 台灯c语言,Jya无线台灯C 告诉你如何重新定义光的含义
  17. 谈谈Gameplay,以及UE4的Gameplay框架
  18. windows家庭版添加windows沙盒功能
  19. 8个亿!河南首富再次无偿捐款西湖大学,西湖大学河南籍校董高达11位
  20. java毕业设计成品源码网站基于javaWeb停车场车辆管理系统的设计与实现|车位

热门文章

  1. 查询hba卡wwn号
  2. 失业了,没办法供房贷怎么办?
  3. mysql数据库视图_MySQL数据库应用总结(九)—MySQL数据库视图的操作
  4. Burp Suite汉化
  5. 18种html5时间轴插件源码_纯css3纵向时光轴 - Jazz Timeline
  6. 服务器响应码302,ajax与302响应代码测试
  7. 小孩入门学什么计算机语言,有一定编程基础的孩子应该学什么编程语言?
  8. 【浏览器】Chrome (on Mac)
  9. css ...更多_有关向不同文化介绍技术概念的更多信息...
  10. 【LeetCode股票买卖系列:714. 买卖股票的最佳时机含手续费 | 暴力递归=>记忆化搜索=>动态规划】