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

题目传送门:

​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;
}