数组中出现次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
分析
排序:
数组排序后,如果符合条件的数存在,则一定是数组中间那个数**。但涉及到排序,时间复杂度O(NlogN) 不是最优解。
一次遍历:
该数出现次数大于其他数字出现次数之和。在遍历时,保存当前数和出现的次数,如果下一个数相同,则次数加一,如果不同则减一,次数到0时,保存下一个数。这样遍历结束后,所保存的数字即为该数。时间复杂度O(n)
实现
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length == 0)
return 0;
//用来记录上一次的记录
int preValue = array[0];
//出现的次数
int count = 1;
for(int i = 1; i < array.length; i++){
if(array[i] == preValue)
count++;
else{
count--;
if(count == 0){
preValue = array[i];
count = 1;
}
}
}
int num = 0;//需要判断是否真的是大于1半数
for(int i=0; i < array.length; i ++)
if(array[i] == preValue)
num ++;
return (num > array.length/2)?preValue:0;
}