题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
- 对数组进行排序
- 数组再经过排序后,数字出现频率超一半的,一定是数组的中位数
- 但是数组的中位数不一定是频率出现最高的数,需要判断一下这个数字出现的频率是否超过整个数组长度的一半
- 如果这个数字出现频率超过数组长度的一半,则找到这个数字;否则没有这个数字,返回0
C代码如下:
//快速排序算法
void quickSort(int * a, int left, int right){
int i, j, tmp, t;
if (left > right){
return;
}
tmp = a[left];
i = left;
j = right;
while (i != j){
while (a[j] >= tmp && i < j)
--j;
while (a[i] <= tmp && i < j)
++i;
t = a[i];
a[i] = a[j];
a[j] = t;
}
a[left] = a[j];
a[j] = tmp;
quickSort(a, left, j - 1);
quickSort(a, j + 1, right);
}
//数组再经过排序后,数字出现频率超一半的,一定是数组的中位数
int checkMoreThanHalf(int * arr){
int len = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, len - 1);
int mid = len / 2;
int result = arr[mid];
if (!checkIsMoreThanHalf(arr, result, len))
{
result = 0;
}
return result;
}
//判断一下这个数字出现的频率是否超过整个数组长度的一半
int checkIsMoreThanHalf(int * arr, int result, int len){
int i;
int count = 0;
for (i = 0; i < len; i++){
if (arr[i] == result)
++count;
}
if (count >(len - 1) / 2)
return 1;
else
return 0;
}