题目:一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[] = {2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。
解法一:数组中有一个数字出现的次数超过了数组长度的一半,如果把数组排序,排序之后位于数组中间的数字一定是出现次数超过数组长度一半的数字。排序算法可以使用sort(快排),它的时间复杂度为O(n*logn)。例如:{2,5,7,2,2,8,2,2}排序后为:{2,2,2,2,2,5,7,8} ,中位数2是出现次数超过一半的数字。
#include<vector>
#include<algorithm>
int MoreThanHalfNum(vector<int> v)
{
if(v.empty())
return 0;
std::sort(v.begin(),v.end());
int middle = v[v.size()/2]; //取中间的数,可能是目标数,也可能不是。需要进行下列判断
int times = 0; //出现的次数
for(int i = 0; i < v.size(); ++i) //统计出现的次数
{
if(v[i] == middle)
++times;
}
return times>v.size()/2?middle:0;
//如果次数超过数组长度的一半就返回中位数,否则返回0;
}
void TestMoreThanHalfNum()
{
int a1[] = {2,3,2,2,2,2,2,5,4,1,2,3};
int a2[] = {1,2,4,3,3,3,3,3,3,7,1};
std::vector<int> v1(a1,a1