题1:JZ39数组中出现次数超过一半的数字
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
//题解1:排序,出现次数最多的数字,一定在中间位置;然后检测中间出现的数字出现的次数是否符合要求
class solution
{
public:
int MoreThanHalfNum_Solution(vector<int>& numbers)
{
sort(numbers.begin(),numbers.end());
int count = 0;
int target = numbers[numbers.size()/2];
for(int i = 0; i < numbers.size(); i++)
{
if(target == numbers[i])
{
count++;
}
}
if(count > numbers[numbers.size()/2])
{
return target;
}
return 0;
}
}
//题解2:定义map,使用<数字,次数>的映射关系,最后统计每个字符出现的次数
class solution
{
public:
int MoreThanHalfNum_Solution(vector<int>& numbers)
{
unorder_map<int,int> map;
int half = numbers.size()/2;
for(int i = 0; i < numbers.size(); i++)
{
auto it = map.find(numbers[i]);
//如果已经在map中,进行自增,
if(it != map.end())
{
map[numbers[i]]++;
}
else
{
//如果不在,插入,首次出现
map.insert(make_pair(numbers[i],1));
}
//自增或插入一个,直接进行判定,注意:这里幺考虑测试用例为{1}的情况;
if(map[numbers[i]] > half)
{
return numbers[i];
}
}
return 0;//走到这里,说明没有找到
}
}