数组中出现数字超一半的数字

解法一:

数组中出现数字超一半的数字,长度为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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值