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

时间:2022-03-09 11:02:29

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
 
解析:方法一:这道题最low的解法是,用一个hashmap存起来,最后检查
 
如果存在数量大于一半的数,那么依次选出两个不一样的删掉,最后剩下的数字肯定为那个大于一半的数字。
方法二:从前向后遍历,每次遇到不是0的数字,就找他后面一个不是0的且与他不相等的数字,同时设置为0。最后找到一个不为0的,遍历一遍看这个数字出现的次数是不是大于一半,如果是就返回,不是就返回0
 
方法三  把第一个数字作为参考 count为1,从他往后找,找到一个和他不一致的count-1,count为0时 则跳到下一个作参考,若一致则标志位count++,继续重复运行,最后的参考就是可能是的那个数字,再遍历一遍看 总数是否大于一半
 
方法三十分巧妙,代码如下:
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int length=array.length;
        if(array==null||length<=0){
            return 0;
        }
        
        int result=array[0];
        int times=1;
        for(int i=1;i<length;i++){
            if(times==0){
                result=array[i];
                times=1;
            }else{
                if(array[i]==result){
                    times++;
                }else{
                    times--;
                }
            }
        }
        
        times=0;
        for(int i=0;i<length;i++){
            if(result==array[i]){
                times++;
            }
       }
            
       if(times*2<length){
           result=0;
       }
       return result;
    }
}