[每日一题]6:求数组中出现超过一半的数字

题目描述:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路:

  1. 对数组进行排序
  2. 数组再经过排序后,数字出现频率超一半的,一定是数组的中位数
  3. 但是数组的中位数不一定是频率出现最高的数,需要判断一下这个数字出现的频率是否超过整个数组长度的一半
  4. 如果这个数字出现频率超过数组长度的一半,则找到这个数字;否则没有这个数字,返回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;
}
发布了92 篇原创文章 · 获赞 32 · 访问量 4651

猜你喜欢

转载自blog.csdn.net/AngelDg/article/details/104396300