一种特殊情况找众数的思想
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种特殊情况找众数的思想相关的知识,希望对你有一定的参考价值。
一种特殊情况找众数的思想
题目传送门:
https://www.luogu.com.cn/problem/P2397
本题的限制就是众数出现的次数超过一半,且本题空间是 O ( 1 ) O(1) O(1)。
考虑用抵消思想,用两个变量 c , v c,v c,v分别表示当前数出现的次数和当前的数的值。
如果 c = 0 c=0 c=0就 v = a i , c = 1 v=a_i,c=1 v=ai,c=1
否则如果 v = a i , c = c + 1 v=a_i,c=c+1 v=ai,c=c+1
否则 c = c − 1 c=c-1 c=c−1。
最后众数肯定会抵消掉其他的数,而最终剩下的数肯定是众数了。
因此就可以实现 O ( 1 ) O(1) O(1)的空间解决该问题!!
// Problem: P2397 yyy loves Maths VI (mode)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2397
// Memory Limit: 5 MB
// Time Limit: 1000 ms
// Date: 2021-11-09 13:20:36
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
int n;
int main(){
scanf("%d",&n);
int c=0,v=0;
rep(i,1,n){
int x;scanf("%d",&x);
if(!c) v=x,c=1;
else if(v==x) c++;
else c--;
}
printf("%d\\n",v);
return 0;
}
参考文章
https://zhuanlan.zhihu.com/p/427738558
以上是关于一种特殊情况找众数的思想的主要内容,如果未能解决你的问题,请参考以下文章