题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路
第一个思路是,这个数字出现次数超过数组的一半,那么它一定出现在数组中间,即中位数。因此,我们可以选择数组中任意一个数,对它进行切分(即快速排序中的切分算法,切分后此切分元素左边的数均不大于切分元素,切分元素右边的元素均不小于切分元素)。若切分后此切分元素的下标为n/2,即为中位数,若大于n/2,则在它左边继续上述步骤,反之在右边进行上述步骤。
第二个思路是根据数组特点,这个数字出现的次数比其他数字出现次数的和还多。因此,我们可以保存两个值,一个是数组中的一个数字,另一个是次数,当我们遍历到下一个数字时,当下一个数字与当前保存的值相同,那么我们把次数加1.若不同,则减1,若次数为0,则把当前保存数字改为下一个数字,并把次数设为1.很明显,我们所找的数字就是最后一个把次数设为1的数字,即保存的值。
代码
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if (array == null || array.length <= 0)
return 0;
int result = array[0];
int times = 1;
for (int i = 0; i <array.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 < array.length; i++){
if (result == array[i])
times++;
}
if (times*2 <= array.length)
return 0;
else return result;
}
}