【剑指offer】数组中使用简单算法

46 阅读1分钟

题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;//走到这里,说明没有找到
    }
}