一种特殊情况找众数的思想
题目传送门:
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--------
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};
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;
}