摩尔投票算法( Boyer-Moore Voting Algorithm)
一、Majority Element题目介绍:给定一个长度为n的数组的时候,找出其中的主元素,即该元素在数组中出现的次数大于n/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)的更多相关文章
- Moore majority vote algorithm(摩尔投票算法)
Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...
- 洛谷 P2397:yyy loves Maths VI (mode)(摩尔投票算法)
题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 [h1]udp2:第一题因为语 ...
- 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 ...
- Leetcode Majority Element系列 摩尔投票法
先看一题,洛谷2397: 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 [h ...
- 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨
题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...
- leetcode 229. Majority Element II(多数投票算法)
就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public: vector<int& ...
- LeetCode题解-----Majority Element II 摩尔投票法
题目描述: Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The a ...
- luogu P3765 总统选举(线段树维护摩尔投票+平衡树)
这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...
- Oracle RAC中的投票算法
RAC集群中有三台机器,A,B,C A,B,C都会有3票,假设这是A的心跳线出现问题,整个RAC集群就划分为两个paritition, 一个是只有A的partition,一个是B,C组成的partit ...
随机推荐
- aosp Pixel 修改 SIM 卡支持及解决网络带x问题
去除网络X的方法 adb shell settings put global captive_portal_https_url http://g.cn/generate_204 自己用 php 做一个 ...
- 基于osg的python三维程序开发(二)------向量
上一篇文章展示了如何简单创建一个osg python 程序, 本篇展示了了一些基础数据结构的使用: from pyosg import * vec = osg.Vec3Array() #push ba ...
- git密令使用
git密令是一种非常好用的代码版本管理工具,相比SVN,Sourcetree 使用起来复杂,主要是没有汉化包,当你使用熟练时,其实也是非常简单的,逼格高. 具体使用如下: 情景一:你只有远程库,没有本 ...
- MDI设置父子窗体
1.新建父窗体,设置窗体属性:IsMdicontainer设置成true; 2.拖入button控件,修改button中的text. 3.点击button控件设置代码: //1.窗体实例化 Form ...
- PDA程序开发的运行配置
前言:因为这个项目是公司一直在做的项目,所以只是简单说一下我从下载项目到成功运行的配置 开发工具:APICloud.雷神模拟器.Visusl studio vs配置: 1.svn下载后台代码后,修改w ...
- axios请求拦截器
import axios from 'axios'; // 创建axios实例 let service = null; if (process.env.NODE_ENV === 'deve ...
- 关于动态路由中路由之间的跳转(页面a跳转到页面b)
由addRouters方法获取到后台的动态路由,要实现路由之间的跳转,不可直接用path: '***',而是将动态路由存储到vuex中,再从vuex中取得,如:this.$store.menu.nav ...
- Spark实战--搭建我们的Spark分布式架构
Spark的分布式架构 如我们所知,spark之所以强大,除了强大的数据处理功能,另一个优势就在于良好的分布式架构.举一个例子在Spark实战--寻找5亿次访问中,访问次数最多的人中,我用四个spar ...
- 基于《仙剑奇侠传柔情版》利用Java的简单实现(一)
基于<仙剑奇侠传柔情版>利用Java的简单实现(一) 2018-12-01 23:55:36 by Louis 一,新建一个类GameFrame.class,具体代码如下: pack ...
- Linux nginx安装步骤 centos7
1.安装依赖: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.创建一个文件夹cd /usr/localmk ...