解法一:
数组中出现数字超一半的数字,长度为n的数组中第n/2大的数字
在数组中随机选择一个数字,所有比他它小的放在它左边,比它大的放在它右边。
如果这个选中的数字下标正好是n/2,那么这个是数组的中位数。
如果大于n/2,中位数在它左边。
如果小于n/2,中位数在它右边。
public static int partition(int[] data,int length,int start,int end){
int index=(int) (Math.random()*(end-start)+start);
swap(data,index,end);
int small=start-1;
for(int i=start;i<=end;i++){
if(data[i]<data[index]){
small++;
swap(data,small,i);
}
}
small++;
swap(data,small,end);
return small;
}
public static void swap(int[] data,int a,int b){
int c = data[a];
data[a]=data[b];
data[b]=c;
}
public static int MoreThanHalfNum(int[] data,int length){
if(checkInvalidArray(data,length)){
return 0;
}
int middle=length>>1;
int start=0;
int end=length-1;
int temp=partition(data,length,start,end);
while(temp!=middle){
if(temp>middle){
temp=partition(data,length,start,temp-1);
}else{
temp=partition(data,length,temp+1,end);
}
}
int result=data[temp];
if(!checkMoreThanHalf(data,length,data[temp])){
result=0;
}
return result;
}
public static boolean g_InputInvalid=false;
//考虑无效的输入
public static boolean checkInvalidArray(int[] data,int length){
g_InputInvalid=false;
if(data==null||length<=0){
g_InputInvalid=true;
}
return g_InputInvalid;
}
public static boolean checkMoreThanHalf(int[] data,int length,int number){
int times=0;
for(int i=0;i<length;i++){
if(data[i]==number){
times++;
}
}
boolean isMoreThanHalf=true;
if(times*2<=length){
g_InputInvalid=true;
isMoreThanHalf=false;
}
return isMoreThanHalf;
}
解法二:
//不会修改输入的数组
public static int MoreThanHalfNum2(int[] data,int length){
int result=data[0];
int time=1;
for(int i=1;i<length;i++){
if(time==0){
result=data[i];
time=1;
}else{
if(data[i]==result){
time++;
}else{
time--;
}
}
}
if(!checkMoreThanHalf(data,length,result)){
return 0;
}
return result;
}