例如长度为 9 的数组{1,2,3,2,4,2,5,2,2}。 由于 2 出现的次数是 5 次,超过一半,所以结果为2。
-
算法一:
先排序,然后中间值就是要找的数字
-
图解:
int Cmp_int(const void* vp1, const void* vp2) //定义排序规则
{
return * (int*)vp1 - *(int*)vp2;
}
int Half(int* arr, int len)
{
qsort(arr,len,sizeof(int),Cmp_int);//快速排序,需要引用stdlib.h
return arr[len / 2];
}
int main()
{
int arr[] = { 1,2,3,2,4,2,5,2,2 };
int n = Half(arr,sizeof(arr)/sizeof(arr[0]));
printf("%d\n",n);
return 0;
}
-
算法二:
消消乐,如果两个相邻的数字不一样则相互抵消,如果一样计数器+1,最后剩余的数字就是超过 一半的数字.
-
图解:
int Half(int* arr, int len)//O(n),O(1)
{
int cur = arr[0];//当前值
int count = 1;//当前值的次数
for (int i = 1; i < len; i++)
{
if (count == 0) //不需要比较,当前值直接获胜
{
cur = arr[i];
count = 1;
}
else
{
if (arr[i] == cur)
count++;
else
count--;
}
}
return cur;
}