Leetcode Majority Element系列 摩尔投票法
先看一题,洛谷2397:
题目背景
自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你
题目描述
[h1]udp2:第一题因为语言性质问题,比赛结束后将所有c/c++的程序的内存调为2.2mb后重测。[/h1]
他让redbag找众数
他还特意表示,这个众数出现次数超过了一半
一共n个数,而且保证有
n<=2000000
而且每个数<2^31-1
代码
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int n,cnt,now,x;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&x);
if(x==now) cnt++;
else if(cnt==) now=x,cnt++;
else if(now!=x) cnt--;
}
printf("%d\n",now);
return ;
}
然后,知道了像这样的,求众数的方法叫做摩尔投票法(Moore Voting),而且,它是可以求大于等于[n/3]的众数的!
用类似的方法更新两个房间里的数,(可能会有两个众数,也可能只有一个),然后验证两个待选众数是否正确。
代码
public:
vector<int> majorityElement(vector<int>& nums) { int cnt1 = , cnt2 = ;
int a, b; for(int n: nums){ if (cnt1 == || n == a){
cnt1++; a = n;
}
else if (cnt2 == || n == b){
cnt2++; b = n;
}
else{
cnt1--; cnt2--;
}
} cnt1 = cnt2 = ;
for(int n: nums){
if (n == a) cnt1++;
else if (n == b) cnt2++;
} vector<int> result;
if (cnt1 > nums.size()/) result.push_back(a);
if (cnt2 > nums.size()/) result.push_back(b);
return result;
}
};
UPD:
在F大爷的博客上还看到了一些神奇的东西。
题意
给定一个长度为n的数列,每个数都是1-n以内。
m次询问,每次询问一个区间,再给定s和k个下标。
如果区间内有一个数出现超过区间长度一半,答案是那个数,否则答案是s,然后把k个下标的位置的数字改成这次的答案。
求每一次的答案和最后整个数列的答案。 n,m<=500000,∑k <=1000000
做法
求众数的做法满足区间加法,所以可以用线段树来维护,每次从区间中找到那个数字。
而我们不能保证最后的数一定出现了超过一半次,
我们可以对每个数开一个平衡树来记录它所出现的位置集合,修改操作也直接在平衡树上进行。
%%%%FallDream!!!!
来自PaperCloud的博客,未经允许,请勿转载,TKS!
Leetcode Majority Element系列 摩尔投票法的更多相关文章
- LeetCode题解-----Majority Element II 摩尔投票法
题目描述: Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The a ...
- [LeetCode] Majority Element II 求众数之二
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
- [LeetCode] Majority Element 求众数
Given an array of size n, find the majority element. The majority element is the element that appear ...
- [LeetCode] Majority Element II 求大多数之二
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Note: The a ...
- [LeetCode] Majority Element 求大多数
Given an array of size n, find the majority element. The majority element is the element that appear ...
- Moore majority vote algorithm(摩尔投票算法)
Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...
- 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨
题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...
- 2016.5.18——leetcode:Majority Element
Majority Element 本题收获: 1.初步了解hash,nth_element的用法 2.题目的常规思路 题目: Given an array of size n, find the ma ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...
随机推荐
- Java调用Http/Https接口(1)--编写服务端
Http接口输入的数据一般是键值对或json数据,返回的一般是json数据.本系列文章主要介绍Java调用Http接口的各种方法,本文主要介绍服务端的编写,方便后续文章里的客户端的调用.文中所使用到的 ...
- vue-quill-editor 富文本框使用及上传图片到服务器
注:上传图片需要结合element-ui的upload上传 首先第一步:安装vue-quill-editor或quill两个模块 yarn add vue-quill-editor -D yarn a ...
- 记支付宝接口对接,涉及到提取证书SN号的解决方案
支付宝针对.NET SDK并未封装有提取证书SN序列号的方法,仅针对Java平台才有对应的方法(赤裸裸的歧视啊~~) 要想在提取这个SN序列号有两种方案: 1. 直接用Java SDK包来提取SN 2 ...
- FreeRTOS优先级翻转
举例 //高优先级任务的任务函数 void high_task(void *pvParameters) { while(1) { vTaskDelay(500); //延时500ms,也就是500个时 ...
- react基础学习和react服务端渲染框架next.js踩坑
说明 React作为Facebook 内部开发 Instagram 的项目中,是一个用来构建用户界面的优秀 JS 库,于 2013 年 5 月开源.作为前端的三大框架之一,React的应用可以说是非常 ...
- vs code 调试设置
首先vs code 安装插件:Debugger for Chrome vscode 设置:点击调试按钮,然后调试面板界面再点击设置按钮,添加一个配置,选择环境为:chrome编辑器自动生成一个laun ...
- DELL R730 做raid10
1.服务器开机,在出现下图提示时,同时按着<ctrl >+ < R >键,即可进入配置界面 2.会进入下图 3.按上下键到第一项PERC H730P MINI ,按F2,选择c ...
- Linux 绑定 ttyUSBn 串口方法。
Linux 绑定 ttyUSBn 串口方法. 在linux下, 使用usb转串口, 经常会碰到一个问题: 如果有多个串口, 以不同顺序插入的时候, /dev/ttyUSB0 /dev/ttyUSB1的 ...
- [http] http body中chunked数据的编码格式
一 我们知道,http response的body可以使用chunked编码.这个时候不需要显示的 指定content-length来标记结尾. 如: 我们可以见到编码的chunked字样,并且没有看 ...
- 191016 Linux中安装python3
注意事项:直接在Linux系统中安装python3后会导致yum命令和pip命令失效. 安装python3过程(按下述方法安装依赖包.指定软链接,就不会出错了): # 安装依赖包 yum instal ...