您的位置:首页 > 其它

数组中出现次数超过一半的数字

2016-05-23 11:38 399 查看
/*
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组
{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,输出2.
*/
#include "iostream"
#include "map"
using namespace std;

void MoreThanHalfNum0(int* numbers, int len)
{
if (numbers == NULL || len <= 0)
return;

map<int, int> count;
for (int i = 0; i < len; i++)
count[numbers[i]]++;

int maxCount = 0;
int value;
for (map<int, int>::iterator iter = count.begin(); iter != count.end(); iter++)
{
if (iter->second > maxCount)
{
maxCount = iter->second;
value = iter->first;
}
}
if (maxCount * 2 > len)
cout << value;
else
cout << "No number appearing more than half the length of the array." << endl;
}

//方法二:基于partition算法,找中位数。
//算法前提:如果存在,排序后一定是中位数。先基于快排的思想找出中位数,
//再验证该数字出现次数是否大于长度一半。(实现略)

bool checkMoreThanHalf(int* numbers, int len, int value)
{
int times = 0;
for (int i = 0; i < len; i++)
if (numbers[i] == value)
times++;
if (times * 2 >= len)
return true;
else
return false;
}

//方法三:该数字出现次数比其他数字出现次数和还要多。
void MoreThanHalfNum2(int* numbers, int len)
{
if (numbers == NULL || len <= 0)
return;

int num = numbers[0];
int numCount = 1;

for (int i = 1; i < len; i++)
{
if (numCount == 0)
{
numCount = 1;
num = numbers[i];
}
else if (numbers[i] == num)
numCount++;
else
{
numCount--;
}
}
if (!checkMoreThanHalf(numbers, len, num))
cout << "No number appearing more than half the length of the array." << endl;
else
cout << num << endl;
}

void test()
{
int a[] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };
MoreThanHalfNum0(a, sizeof(a) / sizeof(int));
}

int main()
{
test();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: