数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
这个算法的时间复杂度是O(n),另外用了两个辅助变量。
k用于临时存储数组中的数据,j用于存储某个数出现的次数。
开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。
下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意。
c实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 int Search(int A[],int len) 4 { 5 if(NULL==A || len<=0) 6 { 7 return -1; 8 } 9 10 int k, j=0; 11 for(int i=0;i<len;++i) 12 { 13 if(j==0) 14 { 15 k=A[i]; 16 } 17 if(k==A[i]) 18 { 19 ++j; 20 }else 21 { 22 --j; 23 } 24 } 25 26 return k; 27 } 28 void main(){ 29 int len=10; 30 int a[10]={4,5,5,2,3,5,2,5,5,5}; 31 int result=Search(a,len); 32 printf("%d\n",result); 33 }