如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。
用一般的排序也可以完成这道题目,但是如果那样完成的话就可能太简单了。
用preValue记录上一次访问的值,count表明当前值出现的次数,如果下一个值和当前值相同那么count++;如果不同count–,减到0的时候就要更换新的preValue值了,因为如果存在超过数组长度一半的值,那么最后preValue一定会是该值。
public int MoreThanHalfNum_Solution(int [] array) {
if (array == null || array.length == 0) {
return 0;
}
int pre = array[0];
int count = 1;
for (int i = 1;i<array.length;i++) {
if (pre == array[i]) {
count++;
}else {
count--;
if (count == 0) {
pre = array[i];
count = 1;
}
}
}
// 需要判断是否真的是大于1半数,这一步骤是非常有必要的,因为我们的上一次遍历只是保证如果存在超过一半的数就是pre,但不代表pre一定会超过一半
int num = 0;
for (int i = 0;i<array.length;i++) {
if (pre == array[i]) {
num++;
}
}
return (num>array.length/2)?pre:0;
}
``