一、Majority Element题目介绍:给定一个长度为n的数组的时候,找出其中的主元素,即该元素在数组中出现的次数大于n/2的取整。题目中已经假定所给的数组一定含有元素,且主元素一定存在。一下是一些常用方法:

  1. 遍历每一个元素,并计数
  2. 排序法

二、摩尔投票算法:摩尔投票算法的时间和空间都很低,时间复杂度为O(n),空间复杂度为O(1),这也是选择遮盖算法的原因。

摩尔投票算法是一种在线性时间O(n)和线性空间复杂度下,在一个元素序列中,查找出现次数最多的元素;

算法实现

       1.定义两个变量:m存储当前变量到的元素,count为计数器,初始情况下,count=0;

2.依次遍历数组中的每个元素,当遍历到元素x时,

如果count == 0,那么m=x,然后将count=1;

如果count != 0,将m与x进行比较,如果相等,count++;如果不等,count--;

3.处理完后,最后m存储的值就是这个序列中最多的元素;

int MajorityVote(vector<int> nums) {
int res = 0, cnt = 0;
for (auto &num : nums) {
if (cnt == 0) {
res = num;
cnt++;
}
else if (num == res)cnt++;
else cnt--;
}
return res;
}

三、摩尔投票算法的改进:

1,题目: LeetCode 229 [Majority Element II]

给定一个整型数组,找到所有主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。

算法:每次删除三个不相同的数,最后留下的一定是出现次数超过1/3的数,这个思想可以推广到出现次数超过1/k次的元素有哪些。

因为出现次数大于n/3的元素最多只有两个,所以最开始可以维护两个数字(num1,num2)和两个计数器(counter1,counter2);

遍历数组,当数组中元素和num1或者num2相同,对应的counter1或者counter2加1;

如果counter1或counter2为0,将遍历到的该元素赋给num1或者nums2;

否则counter1和counter2都减1。

C++代码

class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> re;
if (nums.size()==0) return re;
int candidate1 = 0;
int count1 = 0;
int candidate2 = 0;
int count2 = 0;
for (int i=0; i<nums.size(); i++) {
if (nums[i] == nums[candidate1]) count1++;
else if (nums[i] == nums[candidate2]) count2++;
else if (count1==0) {
candidate1 = i;
count1 = 1;
}
else if (count2==0) {
candidate2 = i;
count2 = 1;
}
else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (int i=0; i<nums.size(); i++) {
if (nums[i] == nums[candidate1]) count1++;
else if (nums[i] == nums[candidate2]) count2++;
}
if (count1 > nums.size()/3) re.push_back(nums[candidate1]);
if (count2 > nums.size()/3) re.push_back(nums[candidate2]);
return re;
}
};

摩尔投票算法( Boyer-Moore Voting Algorithm)的更多相关文章

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

    Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...

  2. 洛谷 P2397:yyy loves Maths VI (mode)(摩尔投票算法)

    题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 [h1]udp2:第一题因为语 ...

  3. leetcode 169. Majority Element 多数投票算法(Boyer-Moore Majority Vote algorithm)

    题目: Given an array of size n, find the majority element. The majority element is the element that ap ...

  4. Leetcode Majority Element系列 摩尔投票法

    先看一题,洛谷2397: 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 [h ...

  5. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...

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

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

  7. LeetCode题解-----Majority Element II 摩尔投票法

    题目描述: Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The a ...

  8. luogu P3765 总统选举(线段树维护摩尔投票+平衡树)

    这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...

  9. Oracle RAC中的投票算法

    RAC集群中有三台机器,A,B,C A,B,C都会有3票,假设这是A的心跳线出现问题,整个RAC集群就划分为两个paritition, 一个是只有A的partition,一个是B,C组成的partit ...

随机推荐

  1. Markdown中插入复杂的合并表格方法

    由于Markdown自身的语法限制,不能直接插入有合并单元格的复杂表格. 姓名 学号 专业 张三 2018123456 计算机 赵四 2018222356 自动化 李六 2018666666 信息工程 ...

  2. Spring MVC启动流程分析

    本文是Spring MVC系列博客的第一篇,后续会汇总成贴子. Spring MVC是Spring系列框架中使用频率最高的部分.不管是Spring Boot还是传统的Spring项目,只要是Web项目 ...

  3. linux svn切换用户

    1. 临时切换 在所有命令下强制加上--username 和--password选项. 例如:svn up --username zhangsan --password 123456 2.永久切换 删 ...

  4. STM32 初学不知道外设对应的APB1还是APB2

    STM32参考手册搜索“系统架构”或者“系统结构”,即可查看外设挂在哪个时钟下,也就知道开启哪个时钟了.

  5. ssm框架整合---maven工具来导入jar包

    ssm整合 一.导包(pom.xml文件) <?xml version="1.0" encoding="UTF-8"?> <project x ...

  6. mysql8 修改root密码

    Navicat工具里选中mysql数据库 执行: ALTER user 'root'@'localhost' IDENTIFIED BY 'newpassward'; //newpassward 新密 ...

  7. 【分布式锁】06-Zookeeper实现分布式锁:可重入锁源码分析

    前言 前面已经讲解了Redis的客户端Redission是怎么实现分布式锁的,大多都深入到源码级别. 在分布式系统中,常见的分布式锁实现方案还有Zookeeper,接下来会深入研究Zookeeper是 ...

  8. 倒影box-reflect(可图片可文字)

    需要写兼容写法: -webkit-box-reflect:below 3px -webkit-(repeating)linear/redial-gradient(...): 1.先写direction ...

  9. 01FPGA设计流程

    今天学习了FPGA设计流程的视频,我理解要做一个完整的FPGA系统,所要经历的步骤,先将它简单总结如下: 我在对上面的流程图进行解释: 第一:设计定义就是我们这个FPGA系统或者FPGA设计所要实现的 ...

  10. 硬货 | 手把手带你构建视频分类模型(附Python演练))

    译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ...