给定一个大小为 n 的数组,找出其中所有出现超过 n/3 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]
/*出现次数大于n/2次*/
/*
#include<stdio.h>
int main(void)
{
int n,i,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int m,count=0;
for(i=0;i<n;i++)
{
if(0==count)
{
m=a[i];
++count;
continue;
}
if(a[i]==m)
++count;
else
--count;
}
// printf("%d\n",count);
if(count>=1)
printf("%d\n",m);
}*/
/*出现次数大于n/3的元素*/
#include<stdio.h>
int main(void)
{
int x;
scanf("%d",&x);
int a[x],i,cm=0,m,cn=0,n;
for(i=0;i<x;i++)
scanf("%d",&a[i]);
for(i=0;i<x;i++)
{
if(0==cm||m==a[i])
{
m=a[i];
cm++;
}
else if(0==cn||n==a[i])
{
n=a[i];
cn++;
}
else
{
cn--;
cm--;
}
// printf("%d %d %d %d\n",cm,m,cn,n);
//过程调试;
}
printf("%d %d\n",cm,cn);
if(cm>(cm+cn)/3)
printf("%d\n",m);
if(cn>(cm+cn)/3)
printf("%d",n);
}
/*
8
1
1
1
3
3
2
2
2
/*
3
3
2
3
*/