数组中出现次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路1:如果这个数组是有序的,那么处于数组中间的数字一定是我们要
找的数字,如果存在的话。因此可以用partition的方法对数组进行排序
每排完一次,判断这个数字是否处于中间,如果是,则是我们要找的数字;如果位于后半段,则往前半段找;如果位于前半段,则往后半段找。
当然找到之后,还要对其进行验证。
思路2:根据数组的特征,由于会有超过一半的相同的数字,则可以设定
两个变量,一个记录当前的数字num,一个记录出现的次数times;下一个数字跟当前的数字不同时,则次time–,相同则time++;当time==0时,令num等于下一个数字。遍历一遍之后,num就是我们要找的数字。
思路2的代码:
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length<=0){
return 0;
}
int num=array[0];//保存的数字
int times=1;//出现的次数
for(int i=1;i<array.length;i++){
if(times==0){
num=array[i];
}else if(num==array[i]){
times++;
}else{
times--;
}
}
if(checkNum(num,array))
return num;
else
return 0;
}
/**
* 判断数字出现在数组中的次数是否超过一半
* @param num
* @param array
* @return true超过一半;false没超过一半
*/
public boolean checkNum(int num,int[] array){
int times=0;
for(int i=0;i<array.length;i++){
if(array[i]==num){
times++;
}
}
if(times*2<array.length)//判断出现的次数是否超过一半
return false;
else
return true;
}