思路:1、用快速排序算法中的Partition函数。因为如果数组中出现次数超过数组长度一半的数字,那么当数组排好序后,这个数字肯定是数组的中间下标对应的数,但使用快排时间效率为O(nlogn),这里我们只需要使用partition函数即可,如果partition返回的index是middle,那么就是结果了,如果index大于middle,那么在左边递归,如果index小于middle,那么在右边递归
2、我们在遍历数组的时候保存这个数字和他出现的次数,如果下一个数字也是和这个数字相同,那么次数加一,如果不同次数减一,如果次数为0了那么保存的数字要改变,并且次数变为1。由于我们要找的数字比其他所有数字出现的次数之和还要多,那么最后使得次数变为1的肯定是对应的数字
3、合法性检验。出现次数是否达到数组长度的一般,指针是否有效。
代码:
bool check(int *data, int length,int number)
{
int times = 0;
for (int i = 0; i < length; i++)
{
if (data[i] == number)
times++;
}
if (times * 2 <= length)
return false;
return true;
}
int FindHalfNum(int *data, int length)
{
if (data == NULL||length <= 0)
return 0;
int times = 1;
int result = data[0];
for (int i = 0; i < length; i++)
{
if (times == 0){
times = 1;
result = data[i];
}
if (data[i] == result)
times++;
else
times--;
}
if (check(data, length, result))
return 0;
return result;
}