面试题39:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
思路1: 如果这个数组有序,遍历一边并记录出现次数最多的数字,然后判断是否是出现的次数超过数组长度的一半;先排序再找,时间复杂度为O(nlogn)
//思路1
int findNumberMethod1(int arr[], int length)
{
if (arr == NULL || length <= 0)
{
return -1;
}
fastSort(arr, length, 0, length - 1);
int number = arr[length / 2];
if (checkMoreThanHalf(arr, length, number))
{
return number;
}
else
{
return -1;
}
}
思路2: 如果这个数组有序,那么数组中间的数字一定是出现次数超过一半的;按照快排的思路,将数组排序,找到排在数组中间的数即可,当然还是要判断是否是出现的次数超过数组长度的一半,时间复杂度为O(n);
//思路2
int findNumberMethod2(int arr[], int length)
{
if (arr == NULL || length <= 0)
{
return -1;
}
int start = 0;
int end = length - 1;
int index = partition(arr, length, start, end);
int middle = length >> 1;
while (index != middle)
{
if (index > middle)
{