题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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; } }