【剑指offer】面试题29:数组中出现次数超过一半的数字

题目:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

思路:

保存两个值:一个数组中的数字、一个出现的次数

如果当前值和保存的数字相同,则次数加1;如果不同,则次数减1;当次数为0时,保存当前数字、置次数为1。

代码:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.size()==0)  return 0;//好吧,OJ说这里应该为0
        
        int res=numbers[0];
        int cnt=1;
        
        for(int i=1;i<numbers.size();++i)
        {
            if(numbers[i]==res) cnt++;
            else
            {
                if(cnt) cnt--;
                else//次数为0时
                {
                    res=numbers[i];
                    cnt++;
                }
            }
        }
        
        if(CheckMoreThanHalf(numbers,res))  return res;
        else return 0;
    }
private:
    bool CheckMoreThanHalf(vector<int> numbers, int res)
    {
        int count=0;
        for(int i=0;i<numbers.size();++i)
        {
            if(numbers[i]==res) count++;
        }
        
        if(count>numbers.size()/2)  return true;
        else return false;
    }
};
原文地址:https://www.cnblogs.com/buxizhizhou/p/4722215.html