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

第二十七题:数组中出现次数超过一半的数字

 

题目描述

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

 

思路:

             ①首先要找到该数组中出现次数最多的数字target

             ②计算target在数组中出现的次数

             ③排序后,找出数组中的中位数,该数字为数组中出现次数最多的数(超过数组长度一半)

 

具体实现如下图所示:

 

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

 

具体实现代码如下:

    //解法2
    public int MoreThanHalfNum_Solution(int [] array) {
        if (array == null || array.length == 0){
            return 0;
        }
        //曹操进城
        int result = array[0];
        //战力为1
        int times = 1;
        for (int i = 1; i < array.length; i++){
            if (array[i] == result){
                //兄弟相援
                times++;
            }else {
                //敌军来袭
                times--;
            }
            //空城
            if (times == 0){
                //重新进城
                result = array[i];
                times = 1;
            }
        }
        //计算该数字出现的次数
        int count = 0;
        for (int i = 0; i < array.length; i++){
            if (result == array[i]){
                count++;
            }
        }
        return count > array.length/2 ? result : 0;
    }