1. 程式人生 > >【洛谷P2397】yyy loves Maths VI (mode)【模擬】

【洛谷P2397】yyy loves Maths VI (mode)【模擬】

題目大意:

題目連結:https://www.luogu.org/problemnew/show/P2397
給出長度為 n n 的數列,其中的眾數個數超過了一半。求這個眾數。


思路:

資料範圍要求在 O ( n

) O(n) 的時間複雜度內完成。
那麼排序和 m a p map ,離散這些 n
l o g n nlogn
的可以拜拜了。
那麼自然就要分析一下“眾數個數超過一半”這個條件了。
我們不難發現,一個數列眾數超過了一半,那麼在這個數列裡去掉任意兩個不相等的數字,剩餘的數字中的眾數肯定也超過了一半!
但是怎麼在這個數列中 O
( 1 ) O(1)
找到兩個不相等的數呢?
顯然是不可能的。
那麼可以換一種方式看問題:
假設我們已經知道前 i 1 i-1 個數的眾數和出現次數了,那麼現在讀入第 i i 個數,如果第 i i 個數之前的眾數一樣,那麼就將數量加 1 1 ,如果和之前的眾數不一樣,那麼眾數個數就減 1 1 ,相當於去掉兩個不相等的數(一個眾數和一個不等於眾數的數)。
那麼最終留下來的眾數就是答案了。
時間複雜度 O ( n ) O(n)


程式碼:

#include <cstdio>
using namespace std;

int n,ans,sum,x;

int main()
{
	scanf("%d",&n);
	while (n--)
	{
		scanf("%d",&x);
		if (!sum)  //前面的數都被消除完了,說明沒有眾數
		{
			ans=x;
			sum++;
		}
		else if (ans==x) sum++;
		else sum--;
	}
	printf("%d\n",ans);
	return 0;
}