C++博客
寻找众数的算法很多,比如用排序,然后打印出array[n/2]就可以了,但最好的只达到O(n*logn);但要达到O(n)的话,就要寻找新的方法,借鉴学C的时候,统计一个字符串(只含小写的字母)中每个字母的个数的方法:它是为了减少空间的,采用array[a[i]-'a']++(当然需要初始化为0)来做得,所以我们也可以采用同样的思路来做,但是这个数组必须是非负的,因为它要做数组的下标,而且这个数组的大小必须是比你要输入数组的最大的数要大,否则就会越界。
1/**//*
2 Name:
3 Copyright:
4 Author: LonelyTree
5 Date: 21-09-08 20:31
6 Description: 就是对输入的正整数的个数进行统计,找出其中超过一半的数字,时间复杂度为O(n).
7*/
8
9#include<stdio.h>
10int main()
11{
12 int array[100000],n;
13 int count,temp,i;
14 scanf("%d",&count);
15 while(count--)
16 {
17 scanf("%d",&n);
18 for(i=0;i<100000;i++)
19 {
20 array[i]=0;
21 }
22 for(i=0;i<n;i++)
23 {
24 scanf("%d",&temp);
25 array[temp]++;
26 /**//*printf("temp=%d\n",temp);
27 printf("array[%d]=%d\n",temp,array[temp]);*/
28 }
29 for(i=0;i<100000;i++)
30 {
31 if(array[i]>n/2)
32 {
33 printf("%d\n",i);
34 }
35 }
36 }
37 system("PAUSE");
38 return 0;
39}
40
41
42
43
这个跟桶排比较像,貌似可以用基数排序达到O(n),这个有点不会写。其实还有一个用快速排序的思路做得……
这个就是后话了!有兴趣的话可以在下面讨论讨论!