数组中出现的次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路分析
解法一:由于在有序的情况下,中间的数字必定是出现次数超过一半的数字。基于快速排序的思想,每次确定一个基准数据的位置,循环执行,直至位置为数组中间。代码如下:
public int MoreThanHalfNum_Solution(int [] array) {
int low=0,high=array.length-1,half=array.length>>1;
int index=getPosition(array,low,high);
while(index!=half){
if(index>half){
high=index-1;
index=getPosition(array,low,high);
}else {
low=index+1;
index=getPosition(array,low,high);
}
}
int num = array[index];
int numCount = 0;
for (int i = 0; i< array.length; i++) {
if (array[i] == num) numCount++;
}
if (numCount * 2 <= array.length) return 0;
return num;
}
public int getPosition(int[] nums,int low,int high){
int temp=nums[low];
while(low<high){
while(low<high&&nums[high]>=temp){
high--;
}
nums[low]=nums[high];
while(low<high&&nums[low]<=temp){
low++;
}
nums[high]=nums[low];
}
nums[high]=temp;
return low;
}
解法二:根据数组特性,因为数组中该数字出现次数超过一半。若遍历数组,记录该元素,遇到相同的就次数加1,不同的减一,为负数时,更换元素,则最后一个必然是出现次数超过一半的数字。代码如下:
public int MoreThanHalfNum_Solution(int [] array) {
int res=array[0],times=1;
for(int i=1;i<array.length;i++){
if(res==array[i]){
times++;
}else{
if(times==0){
times=1;
res=array[i];
}else{
times--;
}
}
}
int numCount = 0;
for (int i = 0; i< array.length; i++) {
if (array[i] == res) numCount++;
}
if (numCount * 2 <= array.length) return 0;
return res;
}