题目描述:给你一组有序数组,统计其中各个数字出现的次数(时间复杂度越低越好)
输入:1,1,2,2,2,3,6,6,10
输出:
1 2
2 3
3 1
6 2
10 1
上面要求时间复杂度越小越好,并且是已经排好序的,所以我们就不能用常规的求无序序列的方法求每个元素出现的次数,这样出来的结果肯定时间复杂度不尽如人意,也有人会想到桶排序,但这里给出的数字并没有要求在一个较小的范围内,并且如果出现负数的话,桶排序也就失效了,所以这里我们采用从前往后,依次比较的办法,新创建两个数组,一个存入不重复的元素,一个存相同元素出现的次数,这样可以实现时间复杂度为O(n)。
/*
*对有序数组统计每个元素出现的次数,时间复杂度越小越好
*/
#include
int main()
{
/*
桶排序
当有负数出现,或者输入的数大小跨度太的话,不是很很适合
*/
//int n,i,count,t,a[10000];
//count=0;
//while(scanf("%d",&n)!=EOF)
//{
//count++;
//if(count==1)
//{
//t=n; //标记初识输入数
//}
//a[n]++;
//}
//for(i=t;i<=n;i++)
//{
//if(a[i]!=0)
//printf("%d %d\n",i,a[i]);
//}
//顺序比较不相同的数字,统计,这个可能是最优的
int i,j,k,t,n,a[100],b[100],c[100];
n=0;
while(scanf("%d",&a[n])!=EOF)
{
n++;
}
i=0;
j=0;
k=0;
t=-1;
while(i
if(a[i]!=a[i+1]||i==n-1){
b[j]=a[i];
c[j]=i-t;
j++;
if(i==n-1)
break;
t=i;
}
i++;
}
for(i=0;i
printf("%d %d\n",b[i],c[i]);
}