数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if( array == null || array.length == 0){
return 0;
}
int result = array[0];
int time = 1;
for(int i = 1; i < array.length; i++){
if(time == 0){
result = array[i];
time = 1;
continue;
}
if(result == array[i]){
++time;
}else{
--time;
}
}
time = 0;
for(int i = 0; i < array.length; i++){
if(array[i] == result){
time++;
}
}
return time > (array.length/2) ? result : 0;
}
}
**如果在一个数组中,某个数k的的个数大于数组的一半。那么每个k都与另外一个不相同的数抵消后,那么最后剩下的一个或者几个数一定是这个数k。
我们可以定义一个变量time,类似于线程调度中的信号量,先让result等于array[0],并将time置为1;
当下一个数与result一致时,time+1
不一致时,time-1
当time = 0时,说明前面两个不同的数都两两消除了,此时再重新更新time和reuslt;
如果该数组中有大于一半的数的时候,最后result一定是那个数。
因为在最差的情况下,就像前面**标注的所说,最后这个k一定会被剩下
12 12 12 2
12 12 1 1 2
网友评论