数组中出现次数超过一半的数字
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;
}
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
}
相关文章推荐
- 调用摄像头拍照
- flask web开发 Set it to True to suppress this warning问题
- 对象调用Close 方法和null的分别
- Centos7.0环境部署文档
- 计算机视觉研究群体及专家主页汇总
- 关于cas server无法通过session持久化方式实现集群的问题
- 安卓Fragment使用详解
- keepalived+haproxy实现网站负载均衡和高可用
- 在Eclipse添加Android兼容包( v4、v7 appcompat )
- JFinal 3分钟入门
- Java 实现MapReduce函数
- 人脸识别数据集 FACE RECOGNITION DATABASES
- 程序是怎样跑起来的-第07章 程序是在何种环境中运行的
- ReactiveCocoa之RACMulticastConnection使用(六)
- js中的DOM操作(2)
- 大道至简阅读笔记02
- Redis相关
- debug打印,后台跑,telnet上去也能看
- 运用PowerPoint的3种视图
- 第一篇博客,留作Markdown编辑器的使用指南吧:D