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

Posted whitebear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中出现次数超过一半的数字相关的知识,希望对你有一定的参考价值。

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
  一、首先对该数组进行一个排序,由于该数字出现的次数超过数组长度的一半,则numbers[length/2]必为该数字,但最后仍需要对该数字进行验证,判断是否符合条件
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty())
            return 0;
        sort(numbers.begin(),numbers.end());
        int middle = numbers[numbers.size() / 2];
        int count = 0;
        for(int i = 0;i < numbers.size();i++)
        {
            if(numbers[i] == middle)
                count++;
        }
        return (count > numbers.size()/2) ? middle:0;
    }
};
 
  二、由于该数字出现的次数超过数组长度的一半,遍历整个数字,遇到相同的数字,次数+1,不同的,次数-1,当次数为0时,保存下一个数字,再进行相同+1,不同-1的操作,最后得到的那个数字就是次数超过一半的数字,同样,也需要对该数进行判断是否符合条件。
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty())
            return 0;
        //遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减一
        int result = numbers[0];
        int times = 1;
        for(int i = 1;i < numbers.size();i++)
        {
            if(times == 0)
            {
                result = numbers[i];
                times ++;
            }
            else if(numbers[i] == result)
            {
                times++;
            }
            else
                times--;
        }
        //判断result是否符合条件
        times = 0;
        for(int i = 0;i < numbers.size();i++)
        {
            if(numbers[i] == result)times++;
        }
        return (times>numbers.size()/2)? result:0;
    }
};

 

以上是关于数组中出现次数超过一半的数字的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(39) 数组中出现次数超过一半的数字

剑指 Offer 39. 数组中出现次数超过一半的数字 的 详细题解

数组中出现次数超过一半的数字(C语言+Java)

剑指 Offer 39. 数组中出现次数超过一半的数字

出现次数超过一半的数字

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