例如:
数组{1,2,3,4,1,1,2,1,1}中1出现了5次超过长度9的一半。因此输出1;
注:这里没有考虑出现次数最多的数字是0的情况,关键在于方法
这里给出两种常用方法:
解法一:基于排序(快排)的算法
这种算法优点在于理解起来比较容易,如果一个数出现次数超过长度的一半,那将数组排序之后位于数组中间位置的数一定就是要找到的数。
注:需要检测一下中间的数是否是超过一半的数,因为有可能出现次数最多的也不到一半,根据题目要求自己选择是否需要
下面是代码实现:
#include<iostream>
using namespace std;
bool CheckInvalidArray(int* numers, int length);
int Partition(int* numbers, int length, int start, int end); //快速排序
int MoreThanHalfNum(int* numbers, int length);
int RandomInRange(int min, int max)
{
int random = rand() % (max - min + 1) + min;
return random;
}
void Swap(int* num1, int* num2)
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
bool CheckInvalidArray(int* numers, int length)
{
if(numers == NULL || length <= 0)
return true;
return false;
}
bool CheckMoreThanHalf(int* numbers, int length, int result)
{
int times = 0;
for(int i=0; i<length; i++)
{
if(numbers[i] == result)
times++;
}
if (times*2 <= length)
return false;
return true;
}
int Partition(int* numbers, int length, int start, int end)
{
if (numbers == NULL || length <= 0 || start < 0 || end >= length)
throw new exception("Invalid Parameters");
int index = RandomInRange(start, end);
Swap(&numbers[index], &numbers[end]);
int small = start - 1;
for(index=start; index<end; ++index)
{
if (numbers[index] < numbers[end])
{
++small;
if (small != index)
Swap(&numbers[small], &numbers[index]);
}
}
++small;
swap(numbers[small], numbers[end]);
return small;
}
int MoreThanHalfNum(int* numbers, int length)
{
if(CheckInvalidArray(numbers, length))
return 0;
int middle = length >> 1;
int start = 0;
int end = length - 1;
int index = Partition(numbers, length, start, end);
while (middle != index)
{
if (middle < index)
end = index - 1;
else
start = index + 1;
index = Partition(numbers, length, start, end);
}
int result = numbers[middle];
if (!CheckMoreThanHalf(numbers, length, result))
result = 0;
return result;
}
解法二:根据数组特点寻找
优点:方法简单,实现也很简单
int MoreThanHalfNum2(int* numbers, int length)
{
if(CheckInvalidArray(numbers, length)) //参数不合法
return 0;
int result = numbers[0];
int times = 1;
for (int i=0; i<length; i++)
{
if (times == 0)
{
result = numbers[i];
times = 1;
}
else if(numbers[i] == result)
times++;
else
times--;
}
if(!CheckMoreThanHalf(numbers, length,result))
result = 0;
return result;
}