题目:
数组中一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如:
输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},由于2出现的次数为5次,超过数组的一半,因此输出的结果是2。
我们可以这样考虑:
有如下解法:
方案一:
考虑一下,如果某数出现的次数大于数组长度的一半,那么若我们将数组中所有数字排序的话,中间的数肯定就是要求的数。我们用快排。
随机选中一个数字key,排序后再Key左边的数字都比key小,在key右边的数字都比key大。有关快排解释详情见[链接]。(https://blog.csdn.net/baidu_37964071/article/details/79439679)
如果选中的数在的下标刚好是第n/2的数字,那么这个数字就是中位数.如果下标大于n/2,那么中位数,在它的左边,如果下标小于n/2,那么中位数在它右边.这是一个典型的递归算法。
时间复杂度为O(n)。
下面是代码:
//快排
int Partition(int *array, int length, int left, int right)
{
int key = array[right];
while (left < right)
{
if (left < right&&array[left] <= key)
{
++left;
}
array[right] = array[left];
if (left < right&&array[right] >= key)
{
--right;
}
array[left] = array[right];
}
array[left] = key;
return left;
}
//考虑非法输入
bool CheckInvalidArray(