一种特殊情况找众数的思想

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=c1

最后众数肯定会抵消掉其他的数,而最终剩下的数肯定是众数了。

因此就可以实现 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

以上是关于一种特殊情况找众数的思想的主要内容,如果未能解决你的问题,请参考以下文章

CSU2179: 找众数

众数的完整程序源代码

区间众数(分块)

区间众数

python求一个数组中的众数

数据处理,用C++或者Java编写,求一组数的方差均值众数标准差中位数等